除静态存储外,您也可以创建PVC并配置StorageClass来实现存储资源的动态分配,让系统为您自动预留持久化存储卷。您可以更关注集群应用的存储需求,无需预先手动创建和配置存储资源,降低底层基础设施的复杂性。
使用限制
云盘不支持跨可用区使用。
未开启多重挂载的云盘只能同时被一个Pod挂载。关于多重挂载更多信息,请参见使用NVMe云盘多重挂载及Reservation。
云盘类型和ECS类型需要匹配才可以挂载,否则会导致Pod无法启动。关于云盘类型和ECS类型的匹配关系,请参见实例规格族。
重要当您将集群中的ECS实例从按量付费转换成包年包月时,不能将云盘一起变成包年包月,否则云盘将无法被挂载使用。您可以通过购买SCU的方式降低成本。关于SCU的更多信息,请参见存储容量单位包SCU概述。
前提条件
ACK集群中CSI组件已升级至最新版本。更多版本信息,请参见管理csi-plugin和csi-provisioner组件。
如果您的集群中包含CentOS 7.9镜像(或其他运行小于4.9版本Linux内核)的宿主机,并且在集群中使用了XFS文件系统(fstype参数设置为
xfs
)的存储卷,请勿将CSI组件升级到v1.24.7及以上的版本。因为旧版内核与新版本组件不兼容。如果误升级,挂载XFS文件系统的存储卷的Pod将可能无法启动,对其他文件系统无影响,请提交工单处理。如需将CSI组件升级至v1.26.4版本,您需要将CSI provisioner和CSI plugin同时升级至该版本。
使用说明
您可以通过控制台创建StorageClass和PVC并创建应用,也可以通过kubectl完成此操作。
通过控制台使用云盘动态存储卷
步骤一:创建StorageClass
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在存储类页面,单击右上角的创建。
在创建对话框,配置存储类StorageClass的相关参数。
主要配置项说明如下。
配置项
说明
名称
StorageClass的名称。
存储卷类型
可选择云盘或NAS。本示例选择云盘。
参数
云盘类型。默认参数为type,其值为cloud_essd,支持设置的参数值如下:
高效云盘:
cloud_efficiency
ESSD AutoPL:
cloud_auto
SSD云盘:
cloud_ssd
ESSD云盘:
cloud_essd
ESSD Entry:
cloud_essd_entry
以上参数可任意组合。例如
type: cloud_efficiency, cloud_ssd, cloud_essd
,此配置方式会支持对指定类型的云盘依次创建,直到创建成功。说明不同ECS机型支持的云盘类型不同。更多信息,请参见块存储FAQ。
回收策略
云盘的回收策略,默认为
Delete
。Delete
:删除PVC时,PV和云盘会一起删除。Retain
:删除PVC时,PV和云盘数据不会被删除,需要您手动删除。
如果数据安全性要求高,推荐使用Retain方式,以免误删数据。
绑定模式
云盘的绑定模式。默认为
Immediate
。Immediate
:表示先创建云盘再调度Pod。WaitForFirstConsumer
:延迟绑定,即调度器先调度Pod,并根据Pod的可用区信息创建云盘。
参数配置完成后,单击创建。
创建成功后,您可在存储类列表查看创建的StorageClass。
步骤二:创建PVC
在集群管理页左侧导航栏,选择 。
在存储声明页面,单击右上角的创建。
在创建存储声明对话框,配置PVC参数。
配置项
说明
存储声明类型
支持云盘、NAS、OSS三种云存储类型。本示例选择云盘。
名称
创建的存储声明名称在命名空间内必须唯一。
分配模式
本示例选择使用存储类动态创建,即支持通过StorageClass动态创建PV。
已有存储类
选择已有的StorageClass,用于动态创建PV。
总量
所创建存储卷的容量。
访问模式
仅能使用
ReadWriteOnce
。更多选项请参见通过kubectl命令行使用云盘动态存储卷。单击创建。
创建成功后,在存储声明列表中可看到创建的存储声明,并且已绑定相应的存储卷。
步骤三:创建应用
在集群管理页左侧导航栏,选择 。
在有状态页面,单击使用镜像创建。
配置创建应用的参数信息。
以下主要为您介绍数据卷的配置。关于其他参数的描述,请参见创建有状态工作负载StatefulSet。
ACK数据卷支持配置本地存储和云存储,本示例需要配置云存储类型。配置了一个云盘类型的数据卷,将该云盘挂载到容器的/tmp路径下,在该路径下生成的容器数据会存储到云盘中。
所有的信息都配置完成后,单击创建。
创建成功后,您就可以正常使用数据卷。
通过kubectl命令行使用云盘动态存储卷
步骤一:创建StorageClass
在多可用区集群场景下,您可以根据不同的场景通过以下两种方式创建StorageClass。
使用Topology(延迟绑定)的方式
延迟绑定可以优化ECS和云盘不在一个可用区的问题。下文以部署名为storage-class-csi-wffc.yaml文件为例,创建StorageClass。
使用以下内容,创建storage-class-csi-wffc.yaml文件。
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: alicloud-disk-wait-for-first-consumer provisioner: diskplugin.csi.alibabacloud.com parameters: type: cloud_auto,cloud_essd,cloud_ssd # 使用该配置,按优先级自适应选择云盘类型,最终创建的云盘类型受节点实例、所在可用区云盘支持情况等因素影响。 fstype: ext4 diskTags: "a:b,b:c" encrypted: "false" performanceLevel: PL1 provisionedIops: "40000" burstingEnabled: "false" volumeBindingMode: WaitForFirstConsumer reclaimPolicy: Retain allowVolumeExpansion: true
参数
说明
metadata
name
StorageClass的名称。名称必须以小写字母开头,只能包含小写字母、数字、小数点(.)和短划线(-)。
provisioner
配置为
diskplugin.csi.alibabacloud.com
。表示使用阿里云云盘Provisioner插件创建StorageClass。parameters
参见上文参数列表。
volumeBindingMode
云盘的绑定模式。默认为
Immediate
,支持WaitForFirstConsumer
。Immediate
:表示先创建云盘再创建Pod。WaitForFirstConsumer
:延迟绑定,即调度器先调度Pod,并根据Pod的可用区信息创建云盘。
reclaimPolicy
云盘的回收策略,默认为
Delete
,支持Retain
。Delete
:删除PVC时,PV和云盘会一起删除。Retain
:删除PVC时,PV和云盘数据不会被删除,需要您手动删除。
如果数据安全性要求高,推荐使用Retain方式以免误删数据。
allowVolumeExpansion
配置为true时,可以实现云盘的自动扩容。
执行以下命令,创建StorageClass。
kubectl apply -f storage-class-csi-wffc.yaml
查看创建的StorageClass。
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
先创建云盘再创建Pod的方式
使用以下内容,创建storage-class-immediate.yaml文件。
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: alicloud-disk-immediate provisioner: diskplugin.csi.alibabacloud.com parameters: type: cloud_essd,cloud_ssd,cloud_efficiency #使用该配置,按优先级自适应选择云盘类型,最终创建的云盘类型受节点实例、所在可用区云盘支持情况等因素影响 regionId: cn-beijing zoneId: cn-beijing-b encrypted: "false" reclaimPolicy: Retain allowVolumeExpansion: true volumeBindingMode: Immediate
参数
说明
metadata
name
StorageClass的名称。名称必须以小写字母开头,只能包含小写字母、数字、小数点(.)和短划线(-)。
provisioner
配置为
diskplugin.csi.alibabacloud.com
。表示使用阿里云云盘Provisioner插件创建StorageClass。parameters
参见上文参数列表。
reclaimPolicy
云盘的回收策略,默认为
Delete
,支持Retain
。Delete
:删除PVC时,PV和云盘会一起删除。Retain
:删除PVC时,PV和云盘数据不会被删除,需要您手动删除。
如果数据安全性要求高,推荐使用
Retain
方式,以免误删数据。allowVolumeExpansion
配置为
true
时,可以实现云盘的自动扩容。volumeBindingMode
云盘的绑定模式。默认为
Immediate
,支持WaitForFirstConsumer
。Immediate
:表示先创建云盘再调度Pod。WaitForFirstConsumer
:延迟绑定,即调度器先调度Pod,并根据Pod的可用区信息创建云盘。
执行以下命令,创建StorageClass。
kubectl apply -f storage-class-immediate.yaml
查看创建的StorageClass。
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
步骤二:创建PVC
使用以下内容,创建pvc-disk.yaml文件。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: disk-pvc spec: accessModes: - ReadWriteOnce volumeMode: Filesystem resources: requests: storage: 25Gi storageClassName: alicloud-disk-wait-for-first-consumer
参数
说明
name
PVC的名称。
accessModes
配置访问模式。
volumeMode
可选,挂载云盘的格式,为
Filesystem
或Block
。 默认为文件系统挂载。storageClassName
StorageClass的名称,用于绑定StorageClass。
storage
申请的云盘大小,最小为20 GiB。
其中,可用的访问模式取决于StorageClass中的multiAttach参数以及PVC中的volumeMode,如下表:
参数设置
可用访问模式
multiAttach
volumeMode
ReadWriteOnce
ReadOnlyMany
ReadWriteMany
任意
Filesystem
Block
当使用云盘多挂载功能时,请参见使用NVMe云盘多重挂载及Reservation。
执行以下命令,创建PVC。
kubectl create -f pvc-disk.yaml
查看创建的PVC。
在集群管理页左侧导航栏,选择
。在存储声明页面可以看到创建的PVC。
步骤三:创建应用
使用以下命令,创建Secret,用于设置mysql应用的root账号密码。请注意,在生产环境中请更换密码。
kubectl create secret generic mysql-pass --from-literal=password=mypassword
使用以下内容,创建mysql.yaml文件。
apiVersion: apps/v1 kind: StatefulSet metadata: name: mysql spec: selector: matchLabels: app: mysql serviceName: mysql template: metadata: labels: app: mysql spec: containers: - name: mysql image: mysql:8 env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: name: mysql-pass key: password ports: - containerPort: 3306 name: mysql volumeMounts: - name: pvc-disk mountPath: /var/lib/mysql volumes: - name: pvc-disk persistentVolumeClaim: claimName: disk-pvc
参数
说明
mountPath
云盘挂载的位置。
claimName
PVC的名称,用于绑定PVC。
执行以下命令,创建应用并挂载PVC。
kubectl create -f mysql.yaml
查看已创建的应用。
在集群管理页左侧导航栏,选择
。您可以在有状态页面看到已创建的应用。
验证动态云盘的持久化存储
当某个Pod被删除时,重新部署的Pod将保留之前Pod在存储卷中写入的所有数据。您可以通过以下示例验证动态云盘的持久化存储特性。
确认MySQL应用中已挂载云盘:执行以下命令,查看
/var/lib/mysql
路径下是否挂载了新的云盘。kubectl exec mysql-0 -- df -h /var/lib/mysql
预期输出:
Filesystem Size Used Avail Use% Mounted on /dev/vdd 25G 213M 25G 1% /var/lib/mysql
在云盘里创建文件。
执行以下命令,在
/var/lib/mysql
路径下创建文件test-persistent
。kubectl exec mysql-0 -- touch /var/lib/mysql/test-persistent
执行以下命令,确认文件已创建。
kubectl exec mysql-0 -- ls /var/lib/mysql/test-persistent
预期输出:
/var/lib/mysql/test-persistent
执行以下命令,删除名为
mysql-0
的Pod。kubectl delete pod mysql-0
预期输出:
pod "mysql-0" deleted
验证删除Pod后,云盘中创建的文件是否仍然存在。
执行以下命令,确认重建后的Pod已正常运行。
kubectl get pod mysql-0
预期输出:
NAME READY STATUS RESTARTS AGE mysql-0 1/1 Running 0 12s
执行以下命令,查看之前创建的文件。
kubectl exec mysql-0 -- ls /var/lib/mysql/test-persistent
预期输出:
/var/lib/mysql/test-persistent
test-persistent
文件仍然存在,说明动态云盘的数据可以持久保存。
相关文档
如果您需要加强云盘存储数据的安全性,请参见云盘存储数据安全最佳实践。
如果您需要实时了解云盘的使用情况,请参见使用csi-plugin组件监控节点侧存储资源。
如果您的云盘大小不满足要求或磁盘已满,请参见扩容云盘存储卷。
关于如何实现StatefulSet的持久化存储,请参见实现StatefulSet持久化存储的最佳实践-CSI。
如果您在云盘存储卷的使用过程中遇到问题,请参见云盘存储卷FAQ进行自排查。
如果您有多个Pod共享存储或跨可用区存储的需求时,推荐使用NAS存储卷,请参见NAS存储卷。