一、动态卷制备
动态卷制备允许按需创建存储卷。如果没有动态制备,集群管理员需要手动联系云或存储提供商来创建新的存储卷,并在Kubernetes集群中创建PersistentVolume对象来表示这些卷。动态制备功能消除了集群管理员预先配置存储的需求。相反,它能够在用户请求时自动创建所需的存储卷。
动态卷制备的实现基于storage.k8s.io API组中的StorageClass API对象。集群管理员可以根据需要定义多个StorageClass对象,每个对象指定一个卷插件(也称为provisioner),该卷插件向卷制备商提供在创建卷时所需的数据卷信息和相关参数。
集群管理员可以在集群中定义和公开多种存储,这些存储可以来自相同或不同的存储系统,并具有自定义参数集。这种设计确保了终端用户不必担心存储制备的复杂性和微小差别,但仍然能够从多个存储选项中进行选择。
二、启用动态卷制备
要启用动态制备功能,集群管理员需要预先为用户创建一个或多个 StorageClass 对象。每个 StorageClass 对象定义当动态制备被调用时,要使用哪个驱动以及要传递哪些参数给驱动。StorageClass 的名称必须是一个合法的 DNS 子域名。
以下示例清单显示了如何创建一个名为 “slow” 的 StorageClass 存储类,该存储类提供类似于标准磁盘的永久性磁盘:
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
三、使用动态卷制备
在 Kubernetes 中,用户可以通过在 PersistentVolumeClaim (PVC) 中指定存储类来请求动态制备的存储。在 Kubernetes v1.9 之前,可以使用 volume.beta.kubernetes.io/storage-class 注解来实现这一功能。然而,从 Kubernetes v1.6 开始,不推荐使用该注解。
相反,用户现在应该使用 PersistentVolumeClaim 对象的 storageClassName 字段来指定所需的存储类。这个字段的值必须与集群管理员配置的 StorageClass 名称匹配。
例如:要选择 “fast” 存储类,用户将创建如下的 PersistentVolumeClaim:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: claim1 spec: accessModes: - ReadWriteOnce storageClassName: fast resources: requests: storage: 30Gi
该声明会自动制备一块类似 SSD 的永久磁盘。 在删除该声明后,这个卷也会被销毁。
四、设置默认值的行为
在集群上可以启用动态卷制备,以便在未指定存储类的情况下动态设置所有声明。 集群管理员可以通过以下方式启用此行为:
1、标记一个 StorageClass 为 默认;
2、确保 DefaultStorageClass 准入控制器在 API 服务器端被启用。
管理员可以通过向特定的 StorageClass 添加 storageclass.kubernetes.io/is-default-class 注解来将其标记为默认存储类。当集群中存在默认的 StorageClass,并且用户创建一个未指定 storageClassName 的 PersistentVolumeClaim (PVC) 时,DefaultStorageClass 准入控制器将自动为该 PVC 添加一个指向默认存储类的 storageClassName 字段。
注意:集群上最多只能有一个 默认 存储类,否则无法创建没有明确指定 storageClassName 的PersistentVolumeClaim。
五、拓扑感知
在多可用区集群中,Pod 可以被分散到某个区域的多个可用区。为了确保数据的高可用性和数据冗余,通常情况下,存储后端应该部署在多个可用区中。然而,在单可用区存储后端部署的情况下,可以通过设置卷绑定模式来实现将存储后端制备到 Pod 被调度到的可用区。