使用CNFS自动扩容NAS存储卷

通过定义CNFS中托管的NAS存储卷的自动扩容策略,当NAS存储卷的使用率高于阈值时触发自动扩容。本文介绍如何使用CNFS实现NAS存储卷的自动扩容。

前提条件

  • 集群使用容器网络文件系统CNFS来管理NAS文件系统。更多信息,请参见通过CNFS管理NAS文件系统(推荐)

  • 集群的存储插件为CSI,且存储相关组件满足以下要求:

    • csi-plugincsi-provisioner组件版本不低于v1.20.5-ff6490f-aliyun。如需升级,请参见升级csi-plugincsi-provisioner

    • csi-plugin默认的dnsPolicyClusterFirst。若要使用CNFS自动扩容NAS存储卷,需要手动将ClusterFirst改为ClusterFirstWithHostNet

    • storage-operator组件版本不低于v1.18.8.56-2aa33ba-aliyun。如需升级,请参见管理storage-operator组件

步骤一:配置storage-operator组件开启自动扩容

storage-operator组件中默认的storage-auto-expander负责自动扩容存储资源。连接集群,执行以下命令修改storage-operatorConfigMap文件,开启自动扩容功能。

kubectl patch configmap/storage-operator \
  -n kube-system \
  --type merge \
  -p '{"data":{"storage-auto-expander":"{\"imageRep\":\"acs/storage-auto-expander\",\"imageTag\":\"\",\"install\":\"true\",\"template\":\"/acs/templates/storage-auto-expander/install.yaml\",\"type\":\"deployment\"}"}}'

步骤二:配置NAS自动扩容策略

  1. 查看CNFS对象的状态,需要确保CNFS对象的状态为Available

    1. 查看CNFS对象。

      kubectl get cnfs

      预期输出:

      NAME                                      AGE
      default-cnfs-nas-837d6ea-20210819155623   14d
    2. 查看CNFS对象的状态。

      kubectl get cnfs <上一步查询到的CNFS对象> -o yaml | grep Available

      预期输出:

      status: Available
  2. 使用以下YAML模板创建NAS扩容策略。

    cat << EOF | kubectl apply -f -
    apiVersion: storage.alibabacloud.com/v1alpha1
    kind: StorageAutoScalerPolicy
    metadata:
      name: hybrid-expand-policy
    spec:
      pvcSelector:
        matchLabels:
          app: nginx      # 需要与PVCDeploymentlabels的配置相同,本示例均为app: nginx。
      namespaces:
        - default
        - nginx
      conditions:
        - name: condition1
          key: volume-capacity-used-percentage
          operator: Gt
          values:
            - "80"
      actions:
        - name: action1
          type: volume-expand
          params:
            scale: 100%
            limits: 500Gi
    EOF

    参数

    说明

    pvcSelector

    选择目标PVC,通过Label-Selector方式实现扩容策略与PVC之间的匹配。本示例为nginx

    namespaces

    表示目标PVC所在的命名空间,多个命名空间为或逻辑。若不配置,默认为default。本示例为defaultnginx

    conditions

    表示触发规则的条件,多个condition为与逻辑。每个condition包含以下参数:

    • key:定义一个Metric的类型。

    • volume-capacity-used-percentage:表示容量使用百分比。

    • operator:定义规则,包含Gt(大于)、Lt(小于)、Eq(等于)或Ne(不等于),不限制英文字母大小写。

    • values:规则的具体数值。

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

    actions

    表示满足上述conditions时执行的操作,可以是多个操作。包含以下参数:

    • type:表示行为方式,目前只支持扩容。

    • scale:表示扩容的大小,单位为GiB,或可使用百分比。

    • limits:表示PVC在此action中的最大限制。

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

    本示例的action1表示,当满足扩容条件时NAS存储卷容量以当前容量的100%为单位扩容,最大扩容到500 GiB。

  3. 使用以下YAML模板创建PVCDeployment。

    重要

    通过匹配扩容策略与对应PVCDeployment之间的标签,将扩容策略应用到PVCDeployment中。例如,本示例扩容策略中pvcSelector.matchLabels的值为app: nginx,对应PVCDeploymentlabels的值为app: nginx

    cat << EOF | kubectl apply -f -
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: cnfs-nas-pvc
      labels:
        app: nginx   # 需要与扩容策略YAML模板下pvcSelector.matchLabels的配置相同,本示例均为app: nginx。
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: alibabacloud-cnfs-nas
      resources:
        requests:
          storage: 50Gi
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: cnfs-nas-deployment
      labels:
        app: nginx
    spec:
      selector:
        matchLabels:
          app: nginx   # 需要与扩容策略YAML模板下pvcSelector.matchLabels的配置相同,本示例均为app: nginx。
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx:1.14.2
            volumeMounts:
            - mountPath: "/data"
              name: cnfs-nas-pvc
          volumes:
          - name: cnfs-nas-pvc
            persistentVolumeClaim:
              claimName: cnfs-nas-pvc
    EOF

步骤三:验证NAS存储卷的自动扩容

  1. 查看命名空间default下的所有Pod。

    kubectl get pod

    预期输出:

    NAME                                                            READY   STATUS    RESTARTS   AGE
    cnfs-nas-deployment-56dbcc7fb7-wh79z   1/1      Running            0          20m
  2. 进入应用Pod,在NAS存储卷挂载目录写入50 GB的测试数据。

    cd /data
    dd if=<数据路径> of=<挂载路径>
    kubectl exec -it cnfs-nas-deployment-56dbcc7fb7-wh79z -ti -- dd if=/dev/zero of=/data/test1 bs=1G count=50
  3. 查看触发扩容的事件。

    kubectl get events

    预期输出如下,可以看到当前NAS存储卷的容量使用量已超过80%,触发扩容,NAS存储卷容量将从50 GiB扩容到100 GiB。

    12s         Warning   StartExpand                  persistentvolumeclaim/cnfs-nas-pvc          Start to expand of pvc cnfs-nas-pvc from 50Gi to 100Gi, usedCapacityPercentage:96%, freeSize:2048MB.
    12s         Normal    ExternalExpanding            persistentvolumeclaim/cnfs-nas-pvc          waiting for an external controller to expand this PVC
    12s         Normal    Resizing                     persistentvolumeclaim/cnfs-nas-pvc          External resizer is resizing volume nas-462db2b2-717d-44fe-b0b6-fb4db03a****
    12s         Normal    VolumeResizeSuccessful       persistentvolumeclaim/cnfs-nas-pvc          Resize volume succeeded
  4. CSI NAS监控大盘查看存储卷使用信息。

    1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

    2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择运维管理 > Prometheus 监控

    3. Prometheus监控页面,单击存储监控页签,然后单击CSI NAS页签。

    4. CSI NAS监控大盘中,选择NAS存储卷所在的NamespacePVC名称后,在总容量区域可以查看NAS存储卷当前的容量。

      本示例Namespace选择defaultPVC选择cnfs-nas-pvcNAS存储卷容量

      从上图可见,在10:23:30触发扩容,且扩容后容量为100 GiB。