# 配置云硬盘存储卷自动扩容策略
CCE支持通过CRD的方式定义云盘自动扩容策略，在存储卷剩余容量低于指定阈值时实现自动扩容，保障业务持续运行。本文介绍如何通过Everest的StorageAutoScalerPolicy配置自动扩容策略，并验证云盘存储卷的自动扩容效果。
#### 前提条件
已创建集群，并在集群中安装2.5.92及以上版本的[CCE容器存储（Everest）](https://support.huaweicloud.com/usermanual-cce/cce_10_0066.html)。
#### 约束与限制
- 云盘对应的PV所绑定的PVC已关联StorageClass，且StorageClass中已配置allowVolumeExpansion: true。
  ![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/note_3.0-zh-cn.png)
  CCE默认提供的StorageClass已配置allowVolumeExpansion: true；自行创建的StorageClass需手动配置。StorageClass不支持修改属性，只能新建。
  
- 云硬盘挂载的应用Pod需处于Running状态。
- 触发扩容的最大时间间隔约为2分钟，云盘扩容时间约为1分钟，请勿在3min内将云盘写满。
- 避免多个策略关联到同一个PVC。若多个策略关联到同一PVC，最新创建的策略生效。
- 插件删除后，扩容策略及CRD不会级联删除。
- 若额外配置了安全组或ACL规则，需确保容器能够访问节点3125端口。
 
#### 操作步骤
1. 创建有状态应用及PVC。 
   1. 编写"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
      ```
      
   
   2. 执行以下命令，部署应用。
      ```
      kubectl apply -f statefulset.yaml
      ```
      
   
   3. 确认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
      ```
      
   
   4. 确认Pod处于Running状态。
      ```
      kubectl get pod nginx-0
      ```
      预期输出：
      ```
      NAME       READY   STATUS    RESTARTS   AGE
      nginx-0    1/1     Running   0          17s
      ```
      
   
   
   
   
2. 配置自动扩容策略。 
   1. 编写策略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容量变化。   |
         
      
   
   2. 执行以下命令，创建自动扩容策略。
      ```
      kubectl apply -f pvc-auto-expansion-policy.yaml
      ```
      
   
   
   
   
3. 写入数据触发扩容阈值。 
   1. 在Pod写入数据，使云盘可用容量低于20%阈值。
      ```
      kubectl exec nginx-0 -- sh -c 'dd if=/dev/zero of=/data/fill bs=1M count=8300'
      ```
      
   
   2. 确认磁盘使用率已超过阈值（可用容量占比低于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%阈值。
      
   
   3. 等待控制器同步：控制器约60s检测一次，下一次同步时将自动触发扩容。
   
   
   
   
4. 验证自动扩容结果。 
   1. 查看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。
      
   
   2. 查看扩容事件。
      ```
      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
      ```
      
   
   3. 在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没有触发扩容？
请按以下顺序排查：
1. 策略是否创建在 kube-system 命名空间下。
2. PVC 的标签是否与 pvcSelector.matchLabels 匹配。
3. PVC 所在命名空间是否在 namespaces 列表中。
4. PVC 的可用容量是否确实低于阈值。
5. PVC 绑定的 PV 是否为 EVS 类型（disk.csi.everest.io）。
6. PVC 容量是否已达到策略的 maxCapacity。达到上限后控制器会停止自动扩容，如需更大容量请更新策略的 maxCapacity。
 
#### 相关文档
- 如需手动扩容云硬盘存储卷，请参见[扩容云硬盘存储卷](https://support.huaweicloud.com/usermanual-cce/cce_10_0860.html)。
- 如需了解如何通过StorageClass动态创建云硬盘存储卷，请参见[通过动态存储卷使用云硬盘](https://support.huaweicloud.com/usermanual-cce/cce_10_0615.html)。
- 如需了解CCE容器存储（Everest）插件的功能和版本说明，请参见[CCE容器存储（Everest）](https://support.huaweicloud.com/usermanual-cce/cce_10_0066.html)。
 
