云盘存储卷适用于非共享数据,I/O和延迟要求较高的应用场景。如果您之前没有云盘,您可以通过动态存储卷的方式实现自动创建云盘并挂载到Pod上,以此满足持久化存储需求。本文介绍如何使用云盘动态存储卷,并验证云盘的持久化存储。
使用场景
云盘适用于以下存储场景:
对磁盘I/O要求高的应用,且没有共享数据的需求,如MySQL、Redis等数据存储服务。
高速写日志。
持久化存储数据,不会因Pod生命周期的结束而消失。
除了基于已有云盘创建静态存储卷外,您也可以使用StorageClass(存储类)来定义云盘资源,实现动态创建和分配存储资源。通过在PVC(存储声明)中关联StorageClass,系统会自动根据配置创建并绑定PV(存储卷)。该方式无需预先手动创建和配置存储资源,可以降低底层基础设施的复杂性,让您更关注应用的存储需求。
前提条件
集群中已安装CSI组件。
您可以在集群管理页的左侧导航栏选择升级csi-plugin和csi-provisioner。
,在存储页签下确认csi-plugin和csi-provisioner组件的安装情况。如需升级CSI组件来享受某些特定能力,请参见如果您的集群目前使用Flexvolume组件,由于Flexvolume已废弃,请先迁移到CSI组件。具体操作,请参见迁移Flexvolume至CSI。
注意事项
云盘为非共享存储,未开启多重挂载的云盘只能同时被一个Pod挂载。关于多重挂载更多信息,请参见使用NVMe云盘多重挂载及Reservation。
云盘只能挂载到相同可用区的Pod上,不支持跨可用区挂载。
Pod重建时会重新挂载原有云盘,如果由于其他限制导致Pod无法调度到原可用区,则Pod会因为无法挂载云盘而一直处于Pending状态。
推荐使用StatefulSet挂载云盘或者单独为Pod挂载云盘,不推荐使用Deployment。
未开启多重挂载时,一个云盘只能挂载到一个Pod上,为Deployment挂载云盘时,Replica必须配置为1,即无法为每个Pod配置独立的存储卷,并且不能保证挂载、卸载的优先顺序。此外,由于Deployment的升级策略,重启Pod时,新的Pod可能会一直无法挂载云盘。因此不推荐为Deployment挂载云盘。
使用云盘存储卷时,如果在应用的YAML中配置了
securityContext.fsgroup
,在挂载完成后,kubelet会执行chmod
和chown
操作,导致挂载时间延长。配置了
securityContext.fsgroup
后,挂载云盘时会自动调整卷内文件的所有者,根据文件数量,这可能导致较长的准备时间。对于1.20及以上版本的Kubernetes集群,您可以将fsGroupChangePolicy
配置为OnRootMismatch
,实现仅在首次启动容器时才会调整文件的所有者,后续Pod升级或重建等场景下,挂载时长会恢复正常。若仍不能满足需求,建议利用initContainer自行实现调整权限相关操作。
StorageClass说明
存储类(StorageClass)用于定义存储的类别,您可以为其设置不同的参数,使存储资源能够根据需求自动供应和调整。更多信息,请参见存储基础知识。
安装CSI组件后,ACK会提供云盘相关的StorageClass供您使用。如果默认提供的StorageClass无法满足您的需求,您可以手动创建新的StorageClass。
StorageClass不支持修改属性,只能新建。您可以通过控制台或者
kubectl describe sc <storageclass-name>
命令查看各个StorageClass的详细配置。关于各参数的说明,请参见StorageClass相关参数说明。对于云盒用户,由于云盒内的ESSD云盘仅支持PL0级别,因此需要指定其
performanceLevel
参数值为PL0
。由于默认提供的StorageClass创建的是PL1级别的ESSD云盘,因此无法直接使用,您需要手动创建新的StorageClass。SSD云盘、高效云盘和普通云盘属于上一代云盘产品,已在部分地域及可用区逐步停止售卖。您在选择云盘时,建议选用ESSD PL0云盘或ESSD Entry云盘替换高效云盘和普通云盘,选用ESSD AutoPL云盘替换SSD云盘。
默认提供的StorageClass名称 | 动态创建的云盘类型 |
默认提供的StorageClass名称 | 动态创建的云盘类型 |
alicloud-disk-topology-alltype | 高可用配置。系统会根据待挂载Pod调度到的ECS节点的可用区和实例规格,结合云盘库存,按照ESSD云盘、SSD云盘、高效云盘的顺序依次尝试创建。 该StorageClass已配置 |
alicloud-disk-essd | 创建ESSD云盘。PL等级默认为PL1。 |
alicloud-disk-ssd | 创建SSD云盘。 |
alicloud-disk-efficiency | 创建高效云盘。 |
基于StorageClass动态创建的云盘采用按量付费。
挂载云盘动态存储卷(kubectl)
步骤一:创建StorageClass
如果默认提供的StorageClass无法满足您的需求,您可以手动创建新的StorageClass。StorageClass不支持修改属性,只能新建。
云盘不支持跨可用区挂载,并且某些类型的云盘不支持挂载到某些规格的ECS实例。因此挂载云盘时,需要确保待挂载云盘的Pod所调度到的ECS节点的可用区和规格能够和动态创建的云盘相匹配。关于云盘类型和ECS实例规格的匹配关系,请参见实例规格族。
连接集群。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群或在CloudShell上通过kubectl管理Kubernetes集群。
修改以下YAML内容,并保存为disk-sc.yaml。
在多可用区场景下,建议采用延迟绑定的方式,以此优化因云盘和ECS节点不在一个可用区导致挂载失败的问题。
先调度Pod再创建云盘(延迟绑定)先创建云盘再创建PodapiVersion: 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 # 通过云盒使用时,需设置为PL0。 provisionedIops: "40000" burstingEnabled: "false" volumeBindingMode: WaitForFirstConsumer reclaimPolicy: Retain allowVolumeExpansion: true
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
StorageClass的相关参数说明如下:
参数
说明
参数
说明
name
StorageClass的名称。名称必须以小写字母开头,只能包含小写字母、数字、小数点(.)和短划线(-)。
provisioner
驱动类型。此处配置为
diskplugin.csi.alibabacloud.com
,表示使用阿里云云盘CSI插件。parameters
必须配置的参数为
type
,表示云盘类型。支持设置的参数值如下:cloud_auto
:ESSD AutoPL云盘cloud_essd
(默认值):ESSD云盘cloud_essd_entry
:ESSD Entry云盘cloud_ssd
:SSD云盘cloud_efficiency
:高效云盘elastic_ephemeral_disk_standard
: 标准版弹性临时盘elastic_ephemeral_disk_premium
: 高级版弹性临时盘cloud_regional_disk_auto
: ESSD同城冗余云盘
支持任意组合上述参数,例如:
type: cloud_ssd,cloud_essd,cloud_auto
,此时将按照配置顺序依次尝试创建指定类型的云盘,直到创建成功。volumeBindingMode
云盘的绑定模式。默认为
Immediate
,支持WaitForFirstConsumer
。Immediate
:表示先创建云盘再创建Pod。WaitForFirstConsumer
:延迟绑定,即调度器先调度Pod,并根据Pod的可用区信息创建云盘。
根据绑定模式的配置,可用区选择规则如下:
绑定模式为
WaitForFirstConsumer
时,则选择首个使用PVC的Pod所在可用区为创建云盘的可用区。绑定模式为
Immediate
时,如果zoneId
配置为单个可用区,则选择此可用区作为创建云盘的可用区;如果zoneId
配置为多个可用区,则每次选择轮询配置的多个可用区中的一个作为创建云盘的可用区。
如果是多可用区集群,建议使用
WaitForFirstConsumer
。更多信息,请参见云盘存储卷的高可用配置建议。reclaimPolicy
云盘的回收策略,默认为
Delete
,支持Retain
。Delete
:删除PVC时,PV和云盘会一起删除。Retain
:删除PVC时,PV和云盘数据不会被删除,需要您手动删除。
如果数据安全性要求高,推荐使用Retain方式以免误删数据。
allowVolumeExpansion
配置为
true
时,表示允许云盘扩容。创建StorageClass。
kubectl create -f disk-sc.yaml
查看StorageClass。
kubectl get sc
预期返回:
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE alicloud-disk-efficiency diskplugin.csi.alibabacloud.com Delete Immediate true 158m alicloud-disk-essd diskplugin.csi.alibabacloud.com Delete Immediate true 158m alicloud-disk-ssd diskplugin.csi.alibabacloud.com Delete Immediate true 158m alicloud-disk-topology-alltype diskplugin.csi.alibabacloud.com Delete WaitForFirstConsumer true 158m alicloud-disk-wait-for-first-consumer diskplugin.csi.alibabacloud.com Retain WaitForFirstConsumer true 10s
步骤二:创建PVC
将以下YAML内容保存为disk-pvc.yaml。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: disk-pvc spec: accessModes: - ReadWriteOnce volumeMode: Filesystem resources: requests: storage: 20Gi storageClassName: alicloud-disk-wait-for-first-consumer # 以使用延迟绑定的storageClass为例。
相关参数说明如下:
参数
说明
参数
说明
accessModes
存储卷的访问模式。具体请参见Volume访问模式。
可配置为
ReadWriteOnce
、ReadOnlyMany
或ReadWriteMany
,具体取决于StorageClass中的multiAttach
配置以及PVC中的volumeMode
配置。multiAttach
为false
时,volumeMode
配置为任意值,访问模式仅支持ReadWriteOnce
。multiAttach
为true
,volumeMode
为Filesystem
时,访问模式仅支持ReadWriteOnce
和ReadOnlyMany
。multiAttach
为true
,volumeMode
为Block
时,三种访问模式均支持。
multiAttach
表示是否开启多重挂载。默认为false,表示不开启。更多信息,请参见云盘多重挂载功能。volumeMode
存储卷的模式。取值范围:
Filesystem
(默认):文件系统Block
:块
storage
分配给Pod的存储容量,即要创建的云盘容量大小。
各类型云盘支持的容量范围请参见块存储性能。
storageClassName
要绑定的StorageClass名称。
创建PVC。
kubectl create -f disk-pvc.yaml
查看PVC。
kubectl get pvc
预期返回如下,由于采用延迟绑定的方式,因此此时不会创建PV,PVC会处于Pending状态。
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE disk-pvc Pending alicloud-disk-wait-for-first-consumer <unset> 14s
步骤三:创建应用并挂载云盘
使用以下YAML内容,创建disk-test.yaml文件。
以下YAML示例可以创建包含1个Pod的StatefulSet,Pod通过名为
disk-pvc
的PVC申请存储资源,挂载路径为/data
。apiVersion: apps/v1 kind: StatefulSet metadata: name: disk-test spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 volumeMounts: - name: pvc-disk mountPath: /data volumes: - name: pvc-disk persistentVolumeClaim: claimName: disk-pvc
创建StatefulSet并挂载云盘。
kubectl create -f disk-test.yaml
查看StatefulSet中Pod的部署情况。
kubectl get pod -l app=nginx
预期返回如下,示例使用的StatefulSet副本数为1,因此创建了一个Pod。
NAME READY STATUS RESTARTS AGE disk-test-0 1/1 Running 0 14s
查看挂载路径,确认已挂载云盘。
kubectl exec disk-test-0 -- df -h /data
预期返回:
Filesystem Size Used Avail Use% Mounted on /dev/vdb 20G 24K 20G 1% /data
挂载云盘动态存储卷(控制台)
步骤一:创建存储类(StorageClass)
如果默认提供的StorageClass无法满足您的需求,您可以手动创建新的StorageClass。StorageClass不支持修改属性,只能新建。
云盘不支持跨可用区挂载,并且某些类型的云盘不支持挂载到某些规格的ECS实例。因此挂载云盘时,需要确保待挂载云盘的Pod所调度到的ECS节点的可用区和规格能够和动态创建的云盘相匹配。关于云盘类型和ECS实例规格的匹配关系,请参见实例规格族。
登录容器服务管理控制台,在左侧导航栏选择集群列表。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在存储类页面,单击创建。
在弹出的对话框中,完成参数配置,然后单击创建。
参数
描述
示例
参数
描述
示例
名称
StorageClass名称,自定义输入。格式要求请参考界面提示。
alicloud-disk-wait-for-first-consumer
存储卷类型
选择云盘。
云盘
参数
默认参数为
type
,表示云盘类型。支持设置的参数值如下:cloud_auto
:ESSD AutoPL云盘cloud_essd
(默认值):ESSD云盘cloud_essd_entry
:ESSD Entry云盘cloud_ssd
:SSD云盘cloud_efficiency
:高效云盘elastic_ephemeral_disk_standard
: 标准版弹性临时盘elastic_ephemeral_disk_premium
: 高级版弹性临时盘cloud_regional_disk_auto
: ESSD同城冗余云盘
支持任意组合上述参数,例如:
type: cloud_ssd,cloud_essd,cloud_auto
,此时将按照配置顺序依次尝试创建指定类型的云盘,直到创建成功。type:cloud_auto,cloud_essd,cloud_ssd
回收策略
云盘的回收策略,默认为
Delete
,支持Retain
。Delete
:删除PVC时,PV和云盘会一起删除。Retain
:删除PVC时,PV和云盘数据不会被删除,需要您手动删除。
如果数据安全性要求高,推荐使用Retain方式以免误删数据。
Retain
绑定模式
云盘的绑定模式。默认为
Immediate
,支持WaitForFirstConsumer
。Immediate
:表示先创建云盘再创建Pod。WaitForFirstConsumer
:延迟绑定,即调度器先调度Pod,并根据Pod的可用区信息创建云盘。
根据绑定模式的配置,可用区选择规则如下:
绑定模式为
WaitForFirstConsumer
时,则选择首个使用PVC的Pod所在可用区为创建云盘的可用区。绑定模式为
Immediate
时,如果zoneId
配置为单个可用区,则选择此可用区作为创建云盘的可用区;如果zoneId
配置为多个可用区,则每次选择轮询配置的多个可用区中的一个作为创建云盘的可用区。
如果是多可用区集群,建议使用
WaitForFirstConsumer
。更多信息,请参见云盘存储卷的高可用配置建议。WaitForFirstConsumer
创建完成后,在存储类页面可以看到新创建的StorageClass。
步骤二:创建存储声明(PVC)
在集群管理页左侧导航栏,选择
。在存储声明页面,单击创建。
在弹出的对话框中,完成参数配置,然后单击创建。
参数
描述
示例
参数
描述
示例
存储声明类型
选择云盘。
云盘
名称
PVC名称,自定义输入。格式要求请参考界面提示。
diks-pvc
分配模式
选择使用存储类动态创建。
使用存储类动态创建
已有存储类
选择要绑定的StorageClass。
alicloud-disk-topology-alltype
总量
分配给Pod的存储容量,即要创建的云盘的容量大小。
各类型云盘支持的容量范围请参见块存储性能。
20Gi
访问模式
仅支持ReadWriteOnce,表示卷只能被一个Pod以读写方式挂载。
ReadWriteOnce
创建完成后,在存储声明页面可以看到新创建的PVC。
步骤三:创建应用并挂载云盘
在集群管理页左侧导航栏,选择 。
在有状态页面,单击使用镜像创建。
完成StatefulSet的参数配置,单击创建。
需要注意的参数如下,其他参数按需设置。更多信息,请参见创建有状态工作负载StatefulSet。
配置页
参数
描述
示例
配置页
参数
描述
示例
应用基本信息
应用名称
StatefulSet名称,自定义输入。格式要求请参考界面提示。
disk-test
副本数量
配置StatefulSet的副本数量。
1
容器配置
镜像名称
输入用于部署应用的镜像地址。
anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
所需资源
设置所需的vCPU、内存和临时存储资源。
CPU:0.25 Core
内存:512 MiB
Ephemeral-Storage:不设置
数据卷
单击增加云存储声明,然后完成参数配置。
挂载源:选择步骤二创建的PVC。
容器路径:输入云盘要挂载到的容器路径。
挂载源:disk-pvc
容器路径:/data
查看应用部署情况。
在有状态页面,单击应用名称。
在容器组页签下,确认Pod已正常运行(状态为Running)。
验证云盘的持久化存储(kubectl)
按照上文示例创建的StatefulSet中含有1个Pod,该Pod挂载了一个云盘。当该Pod被删除时,自动创建的新Pod将重新挂载之前的云盘,云盘中的数据仍然保留。您可以通过以下方式验证云盘的持久化存储。
查看挂载路径,即查看云盘中的数据。
kubectl exec disk-test-0 -- ls /data
预期返回:
lost+found
在云盘中写入文件。
kubectl exec disk-test-0 -- touch /data/test
删除Pod。
kubectl delete pod disk-test-0
删除StatefulSet中的Pod后,系统会自动创建一个新的Pod。
查看新创建的Pod。
kubectl get pod -l app=nginx
预期返回如下,由于StatefulSet的命名特性,新创建的Pod和之前的Pod名称一致。
NAME READY STATUS RESTARTS AGE disk-test-0 1/1 Running 0 27s
确认新创建的Pod已重新挂载云盘,云盘中的数据仍然存在。
kubectl exec disk-test-0 -- ls /data
预期返回如下,可以看到云盘中存在之前写入的
test
文件。lost+found test
相关文档
- 本页导读 (1)
- 使用场景
- 前提条件
- 注意事项
- StorageClass说明
- 挂载云盘动态存储卷(kubectl)
- 步骤一:创建StorageClass
- 步骤二:创建PVC
- 步骤三:创建应用并挂载云盘
- 挂载云盘动态存储卷(控制台)
- 步骤一:创建存储类(StorageClass)
- 步骤二:创建存储声明(PVC)
- 步骤三:创建应用并挂载云盘
- 验证云盘的持久化存储(kubectl)
- 相关文档