动态卷供应

动态卷供给允许按需创建存储卷。如果没有动态供给,集群管理员必须手动调用其云或存储提供商来创建新的存储卷,然后在 Kubernetes 中创建 PersistentVolume 对象来表示这些卷。动态供给特性消除了集群管理员预先供给存储的需求。相反,当用户创建 PersistentVolumeClaim 对象时,它会自动供给存储。

背景

动态卷供给的实现基于 API 组 storage.k8s.io 中的 API 对象 StorageClass。集群管理员可以根据需要定义任意数量的 StorageClass 对象,每个对象指定一个供给卷的卷插件(也称为供给方),以及在供给时传递给该供给方的参数集。集群管理员可以在集群中定义并暴露多种存储类型(来自相同或不同的存储系统),每种类型都带有一组自定义参数。这种设计还确保了最终用户不必担心存储供给的复杂性和细微差别,但仍然能够从多种存储选项中进行选择。

关于存储类的更多信息可以在这里找到。

启用动态供给

要启用动态供给,集群管理员需要为用户预先创建或多个 StorageClass 对象。StorageClass 对象定义了应该使用哪个供给方以及在调用动态供给时应将哪些参数传递给该供给方。StorageClass 对象的名称必须是有效的 DNS 子域名

以下清单创建了一个名为 "slow" 的存储类,它供给标准的磁盘类型持久盘。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: slow
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-standard

以下清单创建了一个名为 "fast" 的存储类,它供给类似 SSD 的持久盘。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-ssd

使用动态供给

用户通过在其 PersistentVolumeClaim 中包含存储类来请求动态供给的存储。在 Kubernetes v1.6 之前,这是通过 volume.beta.kubernetes.io/storage-class 注解完成的。然而,此注解自 v1.9 起已弃用。用户现在应该改用 PersistentVolumeClaim 对象的 storageClassName 字段。此字段的值必须与管理员配置的 StorageClass 的名称匹配(参见 下文)。

例如,要选择 "fast" 存储类,用户将创建以下 PersistentVolumeClaim

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: claim1
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: fast
  resources:
    requests:
      storage: 30Gi

此声明会触发自动供给一个类似 SSD 的持久盘。当该声明被删除时,卷也会被销毁。

默认行为

动态供给可以在集群中启用,以便在未指定存储类时,所有声明都动态供给。集群管理员可以通过以下方式启用此行为:

管理员可以通过向特定的 StorageClass 添加 storageclass.kubernetes.io/is-default-class 注解 来将其标记为默认。当集群中存在默认 StorageClass 并且用户创建了一个未指定 storageClassNamePersistentVolumeClaim 时,DefaultStorageClass 准入控制器会自动添加指向默认存储类的 storageClassName 字段。

请注意,如果您在集群中有多个 StorageClass 设置了 storageclass.kubernetes.io/is-default-class 注解为 true,并且随后创建了一个未设置 storageClassNamePersistentVolumeClaim,Kubernetes 将使用最近创建的默认 StorageClass。

拓扑感知

多可用区集群中,Pod 可以分布在区域内的不同可用区。单可用区存储后端应在 Pod 调度到的可用区中供给。这可以通过设置卷绑定模式来实现。