×

概述

通用临时卷是一种临时卷,可以由所有支持持久卷和动态配置的存储驱动程序提供。通用临时卷类似于emptyDir卷,它们为临时数据提供每个 Pod 的目录,该目录在配置后通常为空。

通用临时卷在 Pod 规范中内联指定,并遵循 Pod 的生命周期。它们与 Pod 一起创建和删除。

通用临时卷具有以下特性:

  • 存储可以是本地存储或网络附加存储。

  • 卷可以具有固定的大小,Pod 无法超过该大小。

  • 根据驱动程序和参数,卷可能包含一些初始数据。

  • 假设驱动程序支持,则支持对卷的典型操作,包括快照、克隆、调整大小和存储容量跟踪。

通用临时卷不支持离线快照和调整大小。

由于此限制,以下容器存储接口 (CSI) 驱动程序不支持通用临时卷的以下功能:

  • Azure Disk CSI 驱动程序不支持调整大小。

  • Cinder CSI 驱动程序不支持快照。

生命周期和持久卷声明

卷声明的参数允许在 Pod 的卷源内使用。支持标签、注释和持久卷声明 (PVC) 的整套字段。创建此类 Pod 时,临时卷控制器会在与 Pod 相同的命名空间中创建实际的 PVC 对象(来自“创建通用临时卷”过程中显示的模板),并确保在删除 Pod 时删除 PVC。这将以两种方式之一触发卷绑定和配置:

  • 如果存储类使用立即卷绑定,则立即绑定。

    使用立即绑定,调度程序在卷可用后被迫选择具有访问卷权限的节点。

  • 当 Pod 临时调度到节点上时(WaitForFirstConsumervolume绑定模式)。

    此卷绑定选项推荐用于通用临时卷,因为调度程序可以选择适合 Pod 的节点。

就资源所有权而言,具有通用临时存储的 Pod 是提供该临时存储的 PVC 的所有者。删除 Pod 时,Kubernetes 垃圾收集器会删除 PVC,这通常会触发删除卷,因为存储类的默认回收策略是删除卷。您可以使用回收策略为保留的存储类创建准临时本地存储:存储比 Pod 的生命周期长,在这种情况下,您必须确保单独进行卷清理。在这些 PVC 存在时,它们可以像任何其他 PVC 一样使用。特别是,它们可以作为卷克隆或快照中的数据源进行引用。PVC 对象还保存卷的当前状态。

其他资源

安全

您可以启用通用临时卷功能,允许可以创建 Pod 的用户也可以间接创建持久卷声明 (PVC)。即使这些用户没有权限直接创建 PVC,此功能也能正常工作。集群管理员必须注意这一点。如果这不符合您的安全模型,请使用拒绝具有通用临时卷的对象(例如 Pod)的准入 Webhook。

PVC 的正常命名空间配额仍然适用,因此,即使允许用户使用此新机制,他们也无法使用它来规避其他策略。

持久卷声明命名

自动创建的持久卷声明 (PVC) 的命名方式是将 Pod 名称和卷名称组合起来,中间用连字符 (-) 连接。这种命名约定也带来了不同 Pod 之间以及 Pod 与手动创建的 PVC 之间的潜在冲突。

例如,名为 pod-a 且卷名为 scratch 的 Pod 和名为 pod 且卷名为 a-scratch 的 Pod 最终都会产生相同的 PVC 名称:pod-a-scratch

系统会检测到此类冲突,并且只有当 PVC 是为 Pod 创建时,它才会被用作临时卷。此检查基于所有权关系。现有 PVC 不会被覆盖或修改,但这并不能解决冲突。如果没有正确的 PVC,Pod 将无法启动。

在同一个命名空间中命名 Pod 和卷时,请注意避免命名冲突。

创建通用临时卷

步骤
  1. 创建 pod 对象定义并将其保存到文件中。

  2. 在文件中包含通用临时卷信息。

    my-example-pod-with-generic-vols.yaml
    kind: Pod
    apiVersion: v1
    metadata:
      name: my-app
    spec:
      containers:
        - name: my-frontend
          image: busybox:1.28
          volumeMounts:
          - mountPath: "/mnt/storage"
            name: data
          command: [ "sleep", "1000000" ]
      volumes:
        - name: data (1)
          ephemeral:
            volumeClaimTemplate:
              metadata:
                labels:
                  type: my-app-ephvol
              spec:
                accessModes: [ "ReadWriteOnce" ]
                storageClassName: "gp2-csi"
                resources:
                  requests:
                    storage: 1Gi
    1 通用临时卷声明。