使用CNFS自动扩容NAS存储卷

更新时间:
复制为 MD 格式

手动扩容NAS存储卷需要人工介入。CNFS提供的自动扩容功能更为高效,可预设策略,在存储用量达到阈值时自动触发扩容,实现弹性的容量管理。

工作原理

NAS存储卷的自动扩容由storage-operator组件实现,无需改造业务代码。其核心工作流程如下。

image
  1. 定义策略:创建一个StorageAutoScalerPolicy资源,为storage-operator提供扩容指令,包括目标PVC、触发条件和扩容动作。

    PVC所使用的StorageClass需配置allowVolumeExpansion: true
  2. 持续监控:storage-operator根据策略,持续监控目标PVC的实时存储使用率。

  3. 触发扩容:满足触发条件时,storage-operator自动向该PVC发起一个扩容请求。

  4. 执行扩容:该请求通过CSI(容器存储接口)驱动,最终由底层的阿里云NAS服务执行实际的文件系统扩容操作。

  5. 状态同步:扩容完成后,PVC的状态会自动更新以反映新的容量。

适用范围

  • 存储组件满足以下要求:

    • csi-plugincsi-provisioner:版本不低于v1.20.5-ff6490f-aliyun。

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

      如需升级,请参见管理storage-operator组件

      storage-operatorv1.33.1以下版本时,还需手动修改ConfigMap开启自动扩容功能。

      展开查看具体步骤

      执行以下命令修改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\"}"}}'
    • cnfs-controller:组件已安装。

      托管组件,默认安装,需确保未卸载。
  • 已创建CNFS且状态为Available。可参见通过CNFS管理NAS文件系统中关于创建CNFS的内容。

    查询CNFS状态

    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

步骤一:定义NAS存储卷扩容策略

自动扩容的核心在于定义策略。此步骤将创建一个策略,指定扩容的触发条件与行为。

使用以下YAML模板创建StorageAutoScalerPolicy

该策略定义了当标签为app: nginxPVCdefaultnginx命名空间下,其容量使用率超过80%时,将触发自动扩容。每次扩容增加当前容量的100%,上限为200 GiB。
cat << EOF | kubectl apply -f -
apiVersion: storage.alibabacloud.com/v1alpha1
kind: StorageAutoScalerPolicy
metadata:
  name: hybrid-expand-policy
spec:
   # 通过标签选择器,将此策略应用到匹配的PVC上
  pvcSelector:
    matchLabels:
      app: nginx  # 与PVC及Deployment的labels配置相同
   # 策略生效的命名空间
  namespaces:
    - default
    - nginx
   # 触发扩容的条件
  conditions:
    - name: condition1
      key: volume-capacity-used-percentage  # 监控指标:容量使用百分比
      operator: Gt  # 比较操作:Gt (大于)
      values:
        - "80"   # 阈值:80%
   # 满足条件后执行的操作
  actions:
    - name: action1
      type: volume-expand  # 操作类型:扩容
      params:
        scale: 100%   # 扩容幅度:按当前容量的100%增加
        limits: 200Gi   # 容量上限:扩容后总容量不超过200GiB
EOF

参数

说明

pvcSelector

通过标签选择器(Label Selector)匹配需要应用此扩容策略的PVC。

namespaces

策略生效的命名空间列表,多个命名空间为“或”逻辑。若不配置,默认为default。

conditions

一条触发规则,由一个或多个判断条件(condition)组成。多个condition之间为“与”逻辑,即所有condition同时成立时才会触发规则。

  • key:监控指标的类型。

    • volume-capacity-used-percentage:容量使用百分比。当存储卷的实际已用容量百分比超过设定阈值时,该条件成立。

    • volume-capacity-free-size:剩余可用空间。当存储卷的剩余可用空间小于设定阈值时,该条件成立。

    • volume-capacity-pvc-size:PVC 申请容量。检查 PVC 的原始申请容量(pvc.spec.resources.requests.storage),该值小于设定阈值时,该条件成立。

  • operator:比较操作符。支持Gt (大于)、Lt (小于)、Eq (等于)、Ne (不等于)。不限制英文字母大小写。

  • values:规则的具体数值。

actions

满足conditions时执行的操作列表。系统会按顺序执行第一个满足条件的action

  • type:操作类型,目前仅支持volume-expand(扩容)。

  • scale:扩容的幅度,可以是固定值(如100Gi)或百分比(如50%)。

  • limits:容量上限,扩容后的PVC总容量不会超过此值。建议设置此项以控制成本。

步骤二:创建StorageClass

创建StorageClass,定义存储模板,动态创建基于已有NAS的存储卷。其中,allowVolumeExpansion必须设置为true,为PV提供明确的容量基准。自动扩容策略依赖此基准计算使用率。

cat << EOF | kubectl apply -f -
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: alibabacloud-cnfs-nas  # StorageClass名称,将在后续PVC中引用
mountOptions:
- nolock,tcp,noresvport
- vers=3
parameters:
  volumeAs: subpath
  # server 字段格式为 <nas-server-address>:/<path>
  server: "0cd8b4a576-g****.cn-hangzhou.nas.aliyuncs.com:/k8s"
  archiveOnDelete: "true"
provisioner: nasplugin.csi.alibabacloud.com
reclaimPolicy: Retain
# 必须设置为true以启用卷扩容,这是自动扩容功能的前提
allowVolumeExpansion: true
EOF
参数详细说明,可参见通过CNFS管理NAS文件系统

步骤三:部署应用及关联的PVC

策略创建后,需部署一个带有匹配标签的应用及其PV,以关联策略与PVC。

使用以下YAML模板创建PVCDeployment。请确保两者的labels (app: nginx)与策略中pvcSelector.matchLabels的配置完全一致。

cat << EOF | kubectl apply -f -
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: cnfs-nas-pvc
  labels:
    app: nginx   # 需与扩容策略中的pvcSelector.matchLabels配置相同
spec:
  accessModes:
    - ReadWriteMany
  # 引用此前创建的StorageClass
  storageClassName: alibabacloud-cnfs-nas
  resources:
    requests:
      storage: 20Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: cnfs-nas-deployment
  labels:
    app: nginx
spec:
  selector:
    matchLabels:
      app: nginx  # 需与扩容策略中的pvcSelector.matchLabels配置相同
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
        volumeMounts:
        - mountPath: "/data"
          name: cnfs-nas-pvc
      volumes:
      - name: cnfs-nas-pvc
        persistentVolumeClaim:
          claimName: cnfs-nas-pvc
EOF

步骤四:验证自动扩容结果

策略部署完成后,即可通过模拟数据写入来触发扩容,并观察相关事件和监控指标,以验证策略是否生效。

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

    kubectl get pods -l app=nginx

    预期输出:

    NAME                                                            READY   STATUS    RESTARTS   AGE
    cnfs-nas-deployment-56dbcc7fb7-wh79z   1/1      Running            0          20m
  2. 登录应用Pod并向挂载目录写入20 GiB的测试数据,使存储使用率超过80%的阈值。

    写入时间可能持续较长,具体取决于网络吞吐量、后段存储性能等因素。
    kubectl exec -it <podName> -- dd if=/dev/zero of=/data/testfile bs=1G count=20
  3. 查看触发扩容的事件。

    kubectl get events | grep cnfs-nas-pvc

    扩容触发后,系统会生成相关事件。预期输出中应包含StartExpandVolumeResizeSuccessful等事件,表明扩容已成功触发并完成,容量从 20 GiB 扩容到 40 GiB。

    12s         Warning   StartExpand                  persistentvolumeclaim/cnfs-nas-pvc          Start to expand of pvc cnfs-nas-pvc from 20Gi to 40Gi, usedCapacityPercentage:99%, freeSize:204MB.
    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

    此外,也可以执行kubectl get pvc,查看PVC的容量是否已更新。

  4. CSI NAS监控大盘查看存储卷使用信息。

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

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

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

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

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

生产环境使用建议

为了更好地在生产环境中使用NAS存储卷自动扩容功能,建议遵循以下实践。

维度

说明

成本优化

  • 设置容量上限:在扩容策略actions中,设置合理的limits值,防止因业务异常或配置错误导致容量无限增长。

  • 合理设置扩容步长:scale参数支持百分比或固定容量。对于超大存储卷,使用固定值(如200 Gi)可能比百分比(如50%)更能精确控制成本。

策略与可靠性

  • 预留安全缓冲:conditions中的扩容阈值不应设置过高(如95%),建议为75%-80%,为系统完成扩容流程预留时间和容量缓冲,防止应用在扩容完成前因空间写满而失败。

  • 监控与告警:启用容器存储监控,基于监控指标查看监控大盘,并接入与配置阿里云Prometheus监控

  • 精细化管理:为不同应用或环境创建不同StorageAutoScalerPolicy,实现精细化、场景化的容量管理。

性能考量

容量与性能平衡:自动扩容解决容量(Capacity)问题,而非性能(Performance)瓶颈。如果应用因IOPS或大量小文件读写而变慢,应考虑选择更高性能的NAS类型。