动态卷配置

动态卷配置允许按需创建存储卷。 在没有动态配置的情况下,集群管理员必须手动调用其云或存储提供商以创建新的存储卷,然后创建 PersistentVolume 对象 来在 Kubernetes 中表示它们。 动态配置功能消除了集群管理员预先配置存储的需要。 相反,它会在用户创建 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.kubernetes.io/is-default-class 注释 来将特定 StorageClass 标记为默认。 当集群中存在默认 StorageClass 且用户创建未设置 storageClassNamePersistentVolumeClaim 时,DefaultStorageClass 准入控制器会自动添加指向默认存储类的 storageClassName 字段。

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

拓扑感知

多区域 集群中,Pod 可以分布在区域中的区域。 单区域存储后端应配置在调度 Pod 的区域中。 这可以通过设置 卷绑定模式 来完成。