全部產品
Search
文件中心

Container Service for Kubernetes:使用CNFS自動擴容NAS儲存卷

更新時間:Feb 28, 2026

手動擴容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-plugin和csi-provisioner:版本不低於v1.20.5-ff6490f-aliyun。

      如需升級,請參見升級CSI組件
    • storage-operator:版本不低於v1.18.8.56-2aa33ba-aliyun。

      如需升級,請參見管理storage-operator組件

      storage-operator為v1.33.1以下版本時,還需手動修改ConfigMap開啟自動擴容功能。

      展開查看具體步驟

      執行以下命令修改storage-operator的ConfigMap,以部署並啟用該功能。

      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: nginx的PVC在defaultnginx命名空間下,其容量使用率超過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模板建立PVC及Deployment。請確保兩者的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類型。