动态卷配置
动态卷供应允许按需创建存储卷。如果没有动态供应,集群管理员必须手动调用他们的云或存储提供商来创建新的存储卷,然后创建 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
对象标记为默认; - 确保 API 服务器上启用了
DefaultStorageClass
准入控制器。
管理员可以通过向其添加 storageclass.kubernetes.io/is-default-class
注解来将特定的 StorageClass
标记为默认。当集群中存在默认的 StorageClass
并且用户创建 storageClassName
未指定的 PersistentVolumeClaim
时,DefaultStorageClass
准入控制器会自动添加指向默认存储类的 storageClassName
字段。
请注意,如果您在集群中的多个 StorageClass 上将 storageclass.kubernetes.io/is-default-class
注解设置为 true,然后创建一个未设置 storageClassName
的 PersistentVolumeClaim
,则 Kubernetes 将使用最近创建的默认 StorageClass。
拓扑感知
在多区域集群中,Pod 可以分布在区域内的多个可用区中。单可用区存储后端应在 Pod 调度的可用区中配置。这可以通过设置 卷绑定模式 来完成。