动态卷供应允许按需创建存储卷。如果没有动态供应,集群管理员必须手动调用其云或存储提供商来创建新的存储卷,然后创建 PersistentVolume 对象以在 Kubernetes 中表示它们。动态供应功能消除了集群管理员预先配置存储的需求。相反,它会在用户创建 PersistentVolumeClaim 对象时自动供应存储。
动态卷供应的实现基于 API 组 storage.k8s.io 中的 API 对象 StorageClass。集群管理员可以根据需要定义任意数量的 StorageClass 对象,每个对象都指定一个卷插件(也称为供应者),该插件负责供应卷以及在供应时传递给该供应者的参数集。集群管理员可以在集群内定义并公开多种存储类型(来自相同或不同的存储系统),每种类型都有一组自定义参数。这种设计还确保最终用户不必担心存储供应的复杂性和细微差别,同时仍然能够从多种存储选项中进行选择。
有关更多详细信息,请参阅 存储类 (Storage Classes) 概念。
为了启用动态供应,集群管理员需要预先为用户创建一个或多个 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 对象标记为默认。DefaultStorageClass 准入控制器。管理员可以通过向特定的 StorageClass 添加 storageclass.kubernetes.io/is-default-class 注解来将其标记为默认。当集群中存在默认 StorageClass 且用户创建了未指定 storageClassName 的 PersistentVolumeClaim 时,DefaultStorageClass 准入控制器会自动添加指向默认存储类的 storageClassName 字段。
请注意,如果您在集群中的多个 StorageClass 上将 storageclass.kubernetes.io/is-default-class 注解设置为 true,并且您创建了一个未设置 storageClassName 的 PersistentVolumeClaim,则 Kubernetes 将使用最近创建的默认 StorageClass。
在 多区域 (Multi-Zone) 集群中,Pod 可以分布在区域 (Zone) 中。单区域存储后端应在调度 Pod 的区域中进行供应。这可以通过设置 卷绑定模式 (Volume Binding Mode) 来实现。