通过定义一种或多种扩容策略,在数据卷的使用率高于某个阈值时自动扩容卷。本文档主要介绍如何实现云盘数据卷的自动扩容。

前提条件

注意事项

  • 只支持云盘扩容,不支持缩容。
  • 只有处于挂载状态的云盘才支持扩容。
  • 依赖云盘的Resize能力。更多信息,请参见ResizeDisk
  • 触发扩容的最大时间间隔为2 min,云盘扩容时间为1 min,请确保不要在3 min内将云盘写满。
  • 云盘容量最大为32 TiB。

使用限制

目前仅支持在马来西亚(吉隆坡)地域配置自动扩容云盘数据卷。

步骤一:配置云盘自动扩容策略

  1. 创建StorageClass。
    若已创建StorageClass,则请跳过此步骤。
    1. 使用以下内容,创建storageclass.yaml文件。
      apiVersion: storage.k8s.io/v1
      kind: StorageClass
      metadata:
        name: alicloud-disk-essd
      provisioner: diskplugin.csi.alibabacloud.com
      parameters:
        type: cloud_essd
      reclaimPolicy: Delete
      allowVolumeExpansion: true
    2. 执行以下命令创建StorageClass。
      kubectl create -f storageclass.yaml
  2. 通过CRD(Custom Resource Definitions)创建自动扩容策略。
    1. 使用以下内容,创建StorageAutoScalerPolicy.yaml文件。
      apiVersion: storage.alibabacloud.com/v1alpha1
      kind: StorageAutoScalerPolicy
      metadata:
        name: hybrid-expand-policy
      spec:
        pvcSelector:
          matchLabels:
            app: mysql
        namespaces:
          - default
          - mysql
        conditions:
          - name: condition1
            key: volume-capacity-used-percentage
            operator: Gt
            values:
              - "80"
        actions:
          - name: action1
            type: volume-expand
            params:
              scale: 50Gi
              limits: 100Gi
          - name: action2
            type: volume-expand
            params:
              scale: 50%
              limits: 300Gi
      参数 说明
      pvcSelector 选择目标PVC,通过Label-Selector方式。本示例为mysql
      namespaces 表示目标PVC所在的命名空间,多个命名空间为或逻辑。若不配置,默认为default。本示例为defaultmysql
      conditions 表示触发规则的条件,多个condition为与逻辑。每个condition包含以下参数:
      • key:定义一个Metric的类型。
      • volume-capacity-used-percentage:表示容量使用百分比。
      • operator:定义规则,包含Gt(大于)、Lt(小于)、Eq(等于)或Ne(不等于),不限制英文字母大小写。
      • values:规则的具体数值。

      本示例表示当PVC容量的使用率高于80%时会触发action

      actions 表示满足上述conditions时执行的操作,可以是多个操作。包含以下参数:
      • type:表示行为方式,目前只支持扩容。
      • scale:表示扩容的大小,单位为GiB,或可使用百分比。
      • limits:表示PVC在此action中的最大限制。

      actions中有多个action时,则从首个action开始匹配,执行首个满足条件的action,其余跳过。

      • 本示例的action1表示云盘容量在100 GiB内以50 GiB为单位扩容,最大扩容到100 GiB。
      • 本示例的action2表示当云盘容量大于100 GiB小于300 GiB时,以当前容量的50%扩容,即每次扩容后的总容量为扩容前容量的150%,最大扩容到300 GiB。
    2. 执行以下命令创建自动扩容策略。
      kubectl create -f StorageAutoScalerPolicy.yaml
  3. 创建工作负载StatefulSet。
    1. 使用以下内容,创建StatefulSet.yaml文件。
      apiVersion: apps/v1
      kind: StatefulSet
      metadata:
        name: web
      spec:
        selector:
          matchLabels:
            app: mysql
        serviceName: "nginx"
        replicas: 3
        template:
          metadata:
            labels:
              app: mysql
          spec:
            containers:
              - name: nginx
                image: nginx:1.14.2
                ports:
                  - containerPort: 80
                    name: web
                volumeMounts:
                  - name: www
                    mountPath: /usr/share/nginx/html
        volumeClaimTemplates:
          - metadata:
              name: www
              labels:
                app: mysql
            spec:
              accessModes: [ "ReadWriteOnce" ]
              storageClassName: "alicloud-disk-essd"
              resources:
                requests:
                  storage: 25Gi
    2. 执行以下命令创建工作负载。
      kubectl create -f StatefulSet.yaml

步骤二:验证云盘的自动扩容

  1. 向挂载目录写入数据,使云盘容量使用率高于80%。
    1. 执行以下命令向挂载目录写入数据。
      dd if=<数据路径> of=<挂载路径>
    2. 执行以下命令查看云盘容量详情。
      df -h | grep d-****1

      预期输出:

      Filesystem    Size   Used   Avail   Use%    Mounted on
      /dev/vde      25G    24G    1.5G    95%     /var/lib/kubelet/plugins/kubernetes.io/csi/pv/d-****1/globalmount
  2. 执行以下命令查看扩容事件。
    当云盘容量使用率高于80%时会触发扩容,此时action1满足条件,则使用action1作为扩容策略。
    kubectl get events

    预期输出:

    101s     Warning     StartExpand                persistentvolumeclaim/www-web-1     Start to expand of pvc www-web-1 from 25Gi to 75Gi, usedCapacityPercentage:94%, freeSize:1472MB.
    101s     Warning     ExternalExpanding          persistentvolumeclaim/www-web-1     Ignoring the PVC: did't find a plugin capable of expanding the volume; waiting for an external controller to process this PVC.
    101s     Normal      Resizing                   persistentvolumeclaim/www-web-1     External resizer is resizing volume d-****1
    97s      Normal      FileSystemResizeRequired   persistentvolumeclaim/www-web-1     Require file system resize of volume on node
    96s      Warning     SkipExpand                 persistentvolumeclaim/www-web-1     Pvc www-web-1 is expanding status from 25Gi to 75Gi, this action action2 will skip.
  3. 执行以下命令查看PVC的容量。
    kubectl get pvc

    预期输出:

    NAME        STATUS     VOLUME     CAPACITY     ACCESS MODES     STORAGECLASS          AGE
    www-web-0   Bound      d-****0    25Gi         RWO              alicloud-disk-essd    22m
    www-web-1   Bound      d-****1    75Gi         RWO              alicloud-disk-essd    21m
    www-web-2   Bound      d-****2    25Gi         RWO              alicloud-disk-essd    21m

    从预期输出可得,云盘d-****1已扩容到75 GiB。

  4. 根据步骤1,再次使云盘容量使用率高于80%,进行第二次扩容。

    执行以下命令查看扩容事件。

    kubectl get events

    预期输出:

    6m4s     Warning     StartExpand                persistentvolumeclaim/www-web-1     Start to expand of pvc www-web-1 from 75Gi to 100Gi, usedCapacityPercentage:95%, freeSize:3732MB.
    5m2s     Warning     ExternalExpanding          persistentvolumeclaim/www-web-1     Ignoring the PVC: did't find a plugin capable of expanding the volume; waiting for an external controller to process this PVC.
    2m4s     Normal      Resizing                   persistentvolumeclaim/www-web-1     External resizer is resizing volume d-****1
    3m4s     Normal      FileSystemResizeRequired   persistentvolumeclaim/www-web-1     Require file system resize of volume on node
    5m59s    Warning     SkipExpand                 persistentvolumeclaim/www-web-1     Pvc www-web-1 is expanding status from 75Gi to 100Gi, this action action2 will skip.

    由于action1limit为100 GiB,从预期输出可得,此次只能将云盘从75 GiB扩容到100 GiB。

  5. 根据步骤1,再次使云盘容量使用率高于80%,进行第三次扩容。

    执行以下命令查看扩容事件。

    kubectl get events

    预期输出:

    7m22s    Warning     StartExpand                persistentvolumeclaim/www-web-1     Start to expand of pvc www-web-1 from 100Gi to 150Gi, usedCapacityPercentage:95%, freeSize:3732MB.
    5m2s     Warning     ExternalExpanding          persistentvolumeclaim/www-web-1     Ignoring the PVC: did't find a plugin capable of expanding the volume; waiting for an external controller to process this PVC.
    2m4s     Normal      Resizing                   persistentvolumeclaim/www-web-1     External resizer is resizing volume d-****1
    3m4s     Normal      FileSystemResizeRequired   persistentvolumeclaim/www-web-1     Require file system resize of volume on node
    5m59s    Warning     SkipExpand                 persistentvolumeclaim/www-web-1     Pvc www-web-1 is expanding status from 100Gi to 150Gi, this action action1 will skip.

    由于action1limit为100 GiB,不满足扩容条件。从预期输出可得,使用action2策略将云盘从100 GiB扩容到150 GiB。

  6. 根据步骤1,再次使云盘容量使用率高于80%,进行第四次扩容。

    执行以下命令查看扩容事件。

    kubectl get events

    预期输出:

    0s     Warning     StartExpand                persistentvolumeclaim/www-web-1     Start to expand of pvc www-web-1 from 150Gi to 225Gi, usedCapacityPercentage:94%, freeSize:7637MB.
    0s     Warning     ExternalExpanding          persistentvolumeclaim/www-web-1     Ignoring the PVC: did't find a plugin capable of expanding the volume; waiting for an external controller to process this PVC.
    0s     Normal      Resizing                   persistentvolumeclaim/www-web-1     External resizer is resizing volume d-****1
    0s     Normal      FileSystemResizeRequired   persistentvolumeclaim/www-web-1     Require file system resize of volume on node
    0s     Warning     SkipExpand                 persistentvolumeclaim/www-web-1     Pvc www-web-1 is expanding status from 150Gi to 225Gi, this action action1 will skip.

    从预期输出可得,使用action2策略将云盘从150 GiB扩容到225 GiB。

  7. 根据步骤1,再次使云盘容量使用率高于80%,进行第五次扩容。

    执行以下命令查看扩容事件。

    kubectl get events

    预期输出:

    0s     Warning     StartExpand                 persistentvolumeclaim/www-web-1     Start to expand of pvc www-web-1 from 225Gi to 300Gi, usedCapacityPercentage:94%, freeSize:7637MB.
    0s     Warning     ExternalExpanding           persistentvolumeclaim/www-web-1     Ignoring the PVC: did't find a plugin capable of expanding the volume; waiting for an external controller to process this PVC.
    0s     Normal      Resizing                    persistentvolumeclaim/www-web-1     External resizer is resizing volume d-****1
    0s     Normal      FileSystemResizeRequired    persistentvolumeclaim/www-web-1     Require file system resize of volume on node
    0s     Warning     FileSystemResizeSuccessful  persistentvolumeclaim/www-web-1     MountVolume.NodeExpandVolume succeeded for volume "d-****1"

    由于action2limit为300 GiB,从预期输出可得,此次只能将云盘从225 GiB扩容到300 GiB。

    当云盘容量再次高于80%时,不再触发扩容。