配置云硬盘存储卷自动扩容策略
CCE支持通过CRD的方式定义云盘自动扩容策略,在存储卷剩余容量低于指定阈值时实现自动扩容,保障业务持续运行。本文介绍如何通过Everest的StorageAutoScalerPolicy配置自动扩容策略,并验证云盘存储卷的自动扩容效果。
前提条件
已创建集群,并在集群中安装2.5.92及以上版本的CCE容器存储(Everest)。
约束与限制
- 云盘对应的PV所绑定的PVC已关联StorageClass,且StorageClass中已配置allowVolumeExpansion: true。
CCE默认提供的StorageClass已配置allowVolumeExpansion: true;自行创建的StorageClass需手动配置。StorageClass不支持修改属性,只能新建。
- 云硬盘挂载的应用Pod需处于Running状态。
- 触发扩容的最大时间间隔约为2分钟,云盘扩容时间约为1分钟,请勿在3min内将云盘写满。
- 避免多个策略关联到同一个PVC。若多个策略关联到同一PVC,最新创建的策略生效。
- 插件删除后,扩容策略及CRD不会级联删除。
- 若额外配置了安全组或ACL规则,需确保容器能够访问节点3125端口。
操作步骤
- 创建有状态应用及PVC。
- 编写“statefulset.yaml”文件,通过volumeClaimTemplates为每个Pod自动创建独立PVC,并通过labels为后续策略匹配提供依据。
apiVersion: apps/v1 kind: StatefulSet metadata: name: nginx namespace: default spec: replicas: 1 selector: matchLabels: app: nginx serviceName: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:alpine # 请根据实际应用更换为正确的镜像地址 volumeMounts: - name: data mountPath: /data volumeClaimTemplates: # 为每个Pod自动创建独立PVC - metadata: name: data labels: app: nginx # PVC继承此标签,用于策略匹配 spec: accessModes: ["ReadWriteOnce"] storageClassName: csi-disk resources: requests: storage: 10Gi - 执行以下命令,部署应用。
kubectl apply -f statefulset.yaml
- 确认PVC已创建并绑定。
kubectl get pvc -l app=nginx
预期输出:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE data-nginx-0 Bound pvc-d8073e47-939f-4ebb-b1c0-ff6cf1****** 10Gi RWO csi-disk 18s
- 确认Pod处于Running状态。
kubectl get pod nginx-0
预期输出:
NAME READY STATUS RESTARTS AGE nginx-0 1/1 Running 0 17s
- 编写“statefulset.yaml”文件,通过volumeClaimTemplates为每个Pod自动创建独立PVC,并通过labels为后续策略匹配提供依据。
- 配置自动扩容策略。
- 编写策略pvc-auto-expansion-policy.yaml文件,在kube-system命名空间中创建StorageAutoScalerPolicy,定义扩容阈值与步长。
apiVersion: storage.everest.io/v1 kind: StorageAutoScalerPolicy metadata: name: pvc-auto-expansion namespace: kube-system spec: namespaces: - default pvcSelector: matchLabels: app: nginx maxCapacity: 15Gi rule: availableCapacityThreshold: "20%" expansionStep: "50%"涉及参数说明如下表所示。
参数
类型
是否必填
说明
spec.namespaces
string数组
是
策略生效的命名空间列表。支持具体命名空间名称(例如["default", "production"])或通配符["*"](匹配所有命名空间)。通配符*不可与其他命名空间名称混用。
spec.pvcSelector
LabelSelector
是
PVC标签选择器,支持matchLabels和matchExpressions。仅标签匹配的PVC会被策略管理。选择器不可为空,空选择器不会匹配任何PVC。
spec.maxCapacity
string
是
单个PVC允许扩容到的最大容量。仅支持绝对值格式,例如500Gi、1Ti。
扩容结果超过此值时会被截断为maxCapacity。
spec.rule.availableCapacityThreshold
string
是
可用容量阈值,PVC剩余容量低于此值时触发扩容。支持以下格式:
- 百分比:例如“20%”,表示当可用容量低于当前总容量的20%时触发。以PVC当前容量为基准动态计算。
- 绝对值:例如“5Gi”,表示当可用容量低于5Gi时触发。固定阈值,不随PVC容量变化。
spec.rule.expansionStep
string
是
每次扩容步长。触发扩容后,PVC容量按此步长增加。支持以下格式:
- 百分比:例如“50%”,表示每次扩容增加当前容量的50%(如 10Gi→15Gi)。以PVC当前容量为基准动态计算。
- 绝对值:例如“5Gi”,表示每次扩容固定增加5Gi。固定步长,不随PVC容量变化。
- 执行以下命令,创建自动扩容策略。
kubectl apply -f pvc-auto-expansion-policy.yaml
- 编写策略pvc-auto-expansion-policy.yaml文件,在kube-system命名空间中创建StorageAutoScalerPolicy,定义扩容阈值与步长。
- 写入数据触发扩容阈值。
- 在Pod写入数据,使云盘可用容量低于20%阈值。
kubectl exec nginx-0 -- sh -c 'dd if=/dev/zero of=/data/fill bs=1M count=8300'
- 确认磁盘使用率已超过阈值(可用容量占比低于20%)。
kubectl exec nginx-0 -- sh -c 'df -h /data'
预期输出:
Filesystem Size Used Avail Use% Mounted on /dev/sda 9.8G 8.2G 1.7G 84% /data
此时可用容量占比约17%(1.7G / 9.8G),低于策略定义的20%阈值。
- 等待控制器同步:控制器约60s检测一次,下一次同步时将自动触发扩容。
- 在Pod写入数据,使云盘可用容量低于20%阈值。
- 验证自动扩容结果。
- 查看PVC容量变化。
kubectl get pvc data-nginx-0
预期输出:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE data-nginx-0 Bound pvc-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 15Gi RWO csi-disk 3m29s
PVC容量已从10Gi扩容至15Gi,因策略配置的扩容步长为50%,即每次扩容增加当前容量的50%(10Gi × 50% = 5Gi),所以扩容后容量为10Gi + 5Gi = 15Gi。
- 查看扩容事件。
kubectl get events
预期输出:
LAST SEEN TYPE REASON OBJECT MESSAGE 100s Normal PVCExpanded persistentvolumeclaim/data-nginx-0 PVC default/data-nginx-0 auto expanded from 10Gi to 15Gi (remaining: 16.7%, policy: pvc-auto-expansion) 100s Normal Resizing persistentvolumeclaim/data-nginx-0 External resizer is resizing volume pvc-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 100s Normal ExternalExpanding persistentvolumeclaim/data-nginx-0 waiting for an external controller to expand this PVC 96s Normal FileSystemResizeRequired persistentvolumeclaim/data-nginx-0 Require file system resize of volume on node 25s Normal FileSystemResizeSuccessful persistentvolumeclaim/data-nginx-0 MountVolume.NodeExpandVolume succeeded for volume "pvc-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" 192.168.x.x
- 在Pod内确认文件系统已扩容。
kubectl exec nginx-0 -- sh -c 'df -h /data'
预期输出:
Filesystem Size Used Avail Use% Mounted on /dev/sda 15G 8.2G 6.6G 56% /data
文件系统容量已从10Gi扩容至15Gi,可用空间由1.7G提升至6.6G,扩容完成。
- 查看PVC容量变化。
常见问题
相关文档
- 如需手动扩容云硬盘存储卷,请参见扩容云硬盘存储卷。
- 如需了解如何通过StorageClass动态创建云硬盘存储卷,请参见通过动态存储卷使用云硬盘。
- 如需了解CCE容器存储(Everest)插件的功能和版本说明,请参见CCE容器存储(Everest)。