通过手动创建PV、PVC,可将云盘以静态存储卷的方式挂载到Pod上,以满足持久化存储需求,适用于对磁盘 I/O 性能和低延迟要求高、无数据共享需求的场景
云盘适用于以下存储场景:
对磁盘I/O要求高的应用,且没有共享数据的需求,如MySQL、Redis等数据存储服务。
高速写日志。
持久化存储数据,不会因Pod生命周期的结束而消失。
流程指引
|
适用范围
步骤一:创建PV
创建 PV,将已有云盘声明为集群中的一个可用存储资源。
kubectl
参见以下内容,创建disk-pv.yaml。
需提前获取云盘ID、云盘大小、可用区ID、云盘类型等信息,将YAML中的变量替换为实际值。
apiVersion: v1 kind: PersistentVolume metadata: # 已有云盘ID,如d-uf628m33r5rsbi****** name: "<YOUR-DISK-ID>" annotations: # 推荐配置,以确保Pod调度到支持该云盘类型的节点上 # <YOUR-DISK-CATEGORY>为已有云盘的类型,支持cloud_essd_entry、cloud_auto、cloud_essd、cloud_ssd、cloud_efficiency、cloud_regional_disk_auto csi.alibabacloud.com/volume-topology: '{"nodeSelectorTerms":[{"matchExpressions":[{"key":"node.csi.alibabacloud.com/disktype.<YOUR-DISK-CATEGORY>","operator":"In","values":["available"]}]}]}' spec: capacity: # 已有云盘大小,如 20Gi storage: "<YOUR-DISK-SIZE>" claimRef: apiVersion: v1 kind: PersistentVolumeClaim namespace: default name: disk-pvc accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain csi: driver: diskplugin.csi.alibabacloud.com # 已有云盘ID,如d-uf628m33r5rsbi****** volumeHandle: "<YOUR-DISK-ID>" nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: topology.diskplugin.csi.alibabacloud.com/zone operator: In values: # 已有云盘所在的可用区,例如cn-shanghai-f - "<YOUR-DISK-ZONE-ID>" storageClassName: alicloud-disk-topology-alltype volumeMode: Filesystem相关参数说明如下:
参数
说明
csi.alibabacloud.com/volume-topology此Annotation用于为云盘设置节点亲和性,确保使用该云盘的 Pod能够被调度到支持对应云盘类型的节点上,避免因节点不匹配导致挂载失败。
为确保调度准确性,建议配置云盘类型。支持的类型如下:
ESSD Entry云盘:
cloud_essd_entryESSD AutoPL云盘:
cloud_autoESSD云盘:
cloud_essdSSD云盘:
cloud_ssd高效云盘:
cloud_efficiency同城冗余云盘:
cloud_regional_disk_auto(还需参见nodeaffinity参数说明调整配置)
claimRef指定PV所能绑定的PVC。如果希望PV可被任意PVC绑定,请删除该配置。
accessModes访问模式。取决于是否启用云盘多重挂载功能。
未启用多重挂载:仅支持
ReadWriteOnce(RWO),该云盘一次只能被一个节点以读写方式挂载。已启用多重挂载:
将其作为标准文件系统使用(即已格式化):支持
ReadWriteOnce(RWO)和ReadOnlyMany(ROX)。为防止文件系统(如ext4)在多节点并发写入时数据损坏,不支持
ReadWriteMany(RWX)模式。将其作为裸设备使用(即未格式化):支持
ReadWriteOnce(RWO)、ReadOnlyMany(ROX)和ReadWriteMany(RWX)。
persistentVolumeReclaimPolicyPV的回收策略,决定了绑定的PVC被删除后,PV及后端云盘的生命周期。
Delete:删除PVC时,PV和云盘会一起删除。请谨慎配置。为防止数据意外丢失,可在执行删除前为云盘创建自动快照策略进行备份。
Retain:删除PVC时,PV和云盘不会被删除,需手动释放。
driver使用阿里云云盘时,固定为
diskplugin.csi.alibabacloud.com。nodeAffinity节点亲和性配置。除ESSD同城冗余云盘外,其他云盘类型无法跨可用区挂载,只能挂载到同一可用区下的Pod。该配置可确保Pod调度到云盘所在可用区对应的ECS节点。
对于同城冗余云盘,请将其改为以下内容,以允许云盘挂载到该地域中的任意可用区。
其中
<YOUR-DISK-REGION-ID>为云盘所在地域,例如cn-shanghai。nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: topology.kubernetes.io/region operator: In values: - "<YOUR-DISK-REGION-ID>"storageClassName该配置对静态卷无意义,无需预先创建对应的StorageClass,但需确保PV和PVC中的该配置项取值保持一致。
创建PV。
kubectl create -f disk-pv.yaml查看PV状态,确认为
Available。kubectl get pv预期返回:
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE d-uf628m33r5rsbi****** 20Gi RWO Retain Available default/disk-pvc alicloud-disk-topology-alltype <unset> 1m36s
控制台
-
在ACK集群列表页面,单击目标集群名称,在集群详情页左侧导航栏,选择。
在存储卷页面,单击创建,选择存储卷类型为云盘,按照页面提示完成PV的配置。
参数
描述
访问模式
仅支持ReadWriteOnce。
云盘ID
单击选择云盘,选择与节点处于同一地域可用区下的待挂载的云盘。
文件系统类型
选择以何种数据类型将数据存储到云盘上。支持文件系统类型包括ext4、ext3、xfs、vfat。
步骤二:创建PVC
创建 PVC,绑定上一步创建的 PV。
kubectl
参见以下内容,创建disk-pvc.yaml。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: disk-pvc spec: accessModes: - ReadWriteOnce resources: requests: # 申请的存储容量,需与PV容量保持一致 storage: "<YOUR-DISK-SIZE>" # 与PV中定义的 storageClassName 保持一致 storageClassName: alicloud-disk-topology-alltype # 指定待绑定的 PV volumeName: "<YOUR-DISK-ID>"相关参数说明如下:
参数
说明
accessModes访问模式,需与PV的配置保持一致。
storage分配给Pod的存储容量,需与PV容量保持一致。
storageClassName该配置对静态卷无意义,无需预先创建对应的StorageClass,但需确保PV和PVC中的该配置项取值保持一致。
volumeName指定待绑定的PV。如期望PVC可绑定任意PV,可删除此参数。
创建PVC。
kubectl create -f disk-pvc.yaml查看PVC状态,确认为
Bound。kubectl get pvc预期返回如下,可以看到PVC已关联云盘PV。
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE disk-pvc Bound d-bp1ff1mn65jk8s****** 20Gi RWO alicloud-disk-topology-alltype <unset> 6s
控制台
-
在集群管理页左侧导航栏,选择。
在存储声明页面,单击创建,选择存储声明类型为云盘,按照页面提示完成PVC的创建。
参数
描述
分配模式
选择已有存储卷。
已有存储卷
选择此前创建的PV。
总量
分配给Pod的存储容量,不超过云盘容量上限。
步骤三:创建应用并挂载云盘
创建工作负载,并通过挂载 PVC 来使用云盘。
云盘为非共享存储,未开启多重挂载时一次只能挂载一个Pod。在多副本 Deployment 中共享PVC会导致新Pod无法挂载仍被旧Pod占用的云盘而启动失败。推荐使用StatefulSet或单独为Pod挂载云盘。
如仍需在Deployment中使用云盘,建议使用云盘作为临时存储卷。如需启用多重挂载,请参见使用NVMe云盘多重挂载及Reservation。
kubectl
参见以下内容,创建disk-test.yaml。
以下示例创建了一个副本数为1的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重要在 Pod 中配置
securityContext.fsgroup会导致kubelet在挂载卷时递归修改文件权限(chmod/chown)。若文件数量庞大,将显著延长挂载时间。对于1.20及以上版本的集群,建议将
fsGroupChangePolicy配置为OnRootMismatch,仅在首次挂载且卷根目录权限不匹配时才执行递归的权限变更,以优化挂载性能。若性能仍不满足要求或需更精细的权限控制,建议使用initContainer在主应用容器启动前自行执行权限调整命令。Pod重建时会重新挂载原有云盘。如果由于其他限制导致Pod无法调度到原可用区,Pod会因无法挂载云盘而一直处于Pending状态。
创建StatefulSet并挂载云盘。
kubectl create -f disk-test.yaml查看 Pod 状态,确认为
Running。kubectl get pod -l app=nginx预期输出:
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
控制台
-
在集群管理页左侧导航栏,选择。
-
在有状态页面,单击使用镜像创建。
在有状态页面,单击使用镜像创建,按照页面提示完成StatefulSet的参数配置。
主要配置项如下,详细配置项说明请参见创建有状态工作负载StatefulSet。
配置页
参数
描述
应用基本信息
副本数量
配置StatefulSet的副本数量。
容器配置
镜像名称
输入用于部署应用的镜像地址,如
anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6。所需资源
设置所需的vCPU、内存和临时存储资源。
本示例配置CPU为0.25 Core,内存为512 MiB。
数据卷
单击增加云存储声明(PersistentVolumeClaim),然后完成参数配置。
挂载源:选择此前创建的PVC。
容器路径:输入云盘要挂载到的容器路径,如/data。
查看应用部署情况。
在有状态页面,单击应用名称。
在容器组页签下,确认Pod已正常运行(状态为Running)。
验证数据持久化存储
通过“写入数据 -> 删除 Pod -> 检查数据”的流程,来验证存储在云盘上的数据在 Pod 重建后是否仍然存在。
在 Pod 中写入测试数据。
查看挂载路径,即查看云盘中的数据。
kubectl exec disk-test-0 -- ls /data预期输出:
lost+found在 Pod 中写入测试数据。
以Pod
disk-test-0为例,在其挂载的云盘路径/data下创建一个test文件。kubectl exec disk-test-0 -- touch /data/test
模拟 Pod 故障,删除 Pod。
kubectl delete pod disk-test-0再次执行
kubectl get pod -l app=nginx,可以发现已自动创建一个同名的Pod。验证新 Pod 中的数据。
在新Pod
disk-test-0中再次检查/data目录。kubectl exec disk-test-0 -- ls /data预期输出中,此前创建的 test 文件依然存在,表明即使 Pod 被删除重建,数据也实现了持久化存储。
lost+found test
应用于生产环境
高可用性
Pod调度策略
在PV中正确配置
nodeAffinity和csi.alibabacloud.com/volume-topology,确保Pod在重建后能够成功调度并重新挂载云盘。云盘选型
需综合评估其性能、计费以及节点的可用区和实例规格族,确保Pod能被调度至兼容的节点。
选择云盘类型时,SSD云盘、高效云盘已逐步停止售卖。建议选用ESSD PL0云盘或ESSD Entry云盘替换高效云盘,选用ESSD AutoPL云盘替换SSD云盘。
构建跨可用区容灾方案
应用层容灾: 对于数据库等关键业务,在多个可用区部署应用实例,并通过应用自身的数据同步机制实现高可用。
存储层容灾:选用支持多可用区容灾的云盘类型,将数据实时同步写入同一地域的不同可用区,实现跨可用区的故障恢复,请参见使用ESSD同城冗余云盘。
数据安全:
常态化备份:通过自动快照为云盘创建自动快照,以便数据备份和恢复。
性能与成本优化
资源释放指引
为避免产生预期外的费用并确保数据安全,请遵循以下流程释放无需使用的资源。
删除工作负载
操作:删除所有使用相关PVC的应用,例如Deployment、StatefulSet等。此操作将停止运行的Pod并卸载存储卷。
命令示例:
kubectl delete deployment <your-deployment-name>
删除PVC
删除PV对象:此操作仅移除集群内的资源定义,不会删除后端的云盘实体。
操作:手动删除处于
Released状态的PV。命令示例:
kubectl delete pv <your-pv-name>
相关文档
云盘多可用区部署的配置优化建议,请参见云盘存储卷的高可用配置建议。
云盘容量不足或磁盘已满,请参见扩容云盘存储卷进行扩容。
如果不再使用某块云盘且希望云盘停止计费时,可释放云盘。释放后,云盘及存储在云盘上的数据会被删除、云盘停止计费。
使用云盘存储卷时如遇问题,请参见云盘存储卷FAQ。
如集群仍在使用废弃的FlexVolume组件,请迁移FlexVolume至CSI。
