全部產品
Search
文件中心

Container Service for Kubernetes:使用CNFS管理CPFS通用版動態儲存裝置卷

更新時間:Apr 03, 2026

ACK 可通過 CNFS 將 CPFS 通用版檔案系統掛載為動態儲存裝置卷。配置 StorageClass 後,每個工作負載可自動獲得獨立的 PV,資料隔離,無需手動管理儲存。

流程指引

使用動態儲存裝置卷時,應用建立 PVC 後,系統會根據指定的 StorageClass 自動建立儲存卷和對應的 PV。無需預先分配,支援自動擴容。

在叢集中掛載 CPFS 動態儲存裝置卷的主要流程如下。

  1. 建立CNFS:在叢集中“註冊”已有的CPFS檔案系統。

  2. 建立StorageClass:定義動態儲存裝置卷的供應模板(如回收策略、掛載參數等),並引用CNFS對象作為其後端。

  3. 建立應用:建立PVC並指定使用該StorageClass。系統將自動建立PV並與PVC綁定,隨後建立Pod並掛載儲存卷。

準備工作

  • 根據叢集版本,確認相關組件符合條件。

    如需升級叢集,請參見升級叢集

    1.26及以上

    • 確保CSI組件版本為v1.32.2-757e24b-aliyun及以上。

      如需升級CSI組件,請參見管理CSI組件
    • 已安裝cnfs-nas-daemon組件,並在csi-plugin組件的FeatureGate中增加AlinasMountProxy=true以啟用cnfs-nas-daemon,請參見管理cnfs-nas-daemon組件

    1.26以下

    • 確保CSI組件版本為v1.24.11-5221f79-aliyun及以上。

      如需升級CSI組件,請參見管理CSI組件
    • 已安裝用戶端依賴並重啟csi-plugin組件。

      展開查看操作步驟

      需配置csi-plugin的ConfigMap,使得csi-plugin啟動時自動安裝用戶端依賴。

      1. 檢查是否存在名為csi-plugin的ConfigMap。

        kubectl -n kube-system get cm csi-plugin

        存在

        如果已有名為csi-plugin的ConfigMap,更新該ConfigMap。

        kubectl edit configmap csi-plugin -n kube-system

        data下新增cnfs-client-properties欄位,並配置cpfs-efc=true以安裝用戶端依賴。

        ...
        data:
          cnfs-client-properties: |
            cpfs-efc=true   # csi-plugin啟動時會安裝用戶端依賴

        不存在

        如果沒有名為csi-plugin的ConfigMap,在kube-system命名空間下建立ConfigMap。

        cat <<EOF | kubectl apply -f -
        apiVersion: v1
        kind: ConfigMap
        metadata:
          name: csi-plugin
          namespace: kube-system
        data:
          cnfs-client-properties: |
            cpfs-efc=true   # csi-plugin啟動時會安裝相關依賴。
        EOF
      2. 重啟csi-plugin組件。

        kubectl -n kube-system rollout restart daemonset csi-plugin
  • 已建立與叢集處於同一VPC下的CPFS通用版檔案系統和對應的協議服務,並擷取掛載點地址,詳見建立協議服務並擷取掛載地址

    建議CPFS的協議服務掛載點和叢集處於同一交換器下,以提升使用效能。

使用限制

  • 僅支援部分地區,請參見CPFS通用版開服地區

  • 僅支援通過NFS協議掛載,不支援通過POSIX協議掛載。

  • 僅支援掛載到x86架構的節點上。

  • 不支援跨VPC掛載,僅支援掛載到同一VPC的叢集中。

  • 不支援掛載到作業系統為ContainerOS的節點上。

步驟一:建立CNFS

建立CNFS對象,在叢集中“註冊”已有的CPFS檔案系統。

  1. 參見代碼,建立cnfs.yaml

    apiVersion: storage.alibabacloud.com/v1beta1
    kind: ContainerNetworkFileSystem
    metadata:
      name: cnfs-nfs-cpfs
    spec:
      # 指定後端儲存類型為 CPFS
      type: cpfs  
      # 刪除此 CNFS 時,後端的 CPFS 檔案系統不會被刪除
      reclaimPolicy: Retain  
      parameters:
        # CPFS 的協議服務的掛載點網域名稱
        protocolServer: cpfs-xxxx.xxxx.cpfs.aliyuncs.com  
        # 使用 NFS 用戶端進行掛載
        useClient: NFSClient  

    參數說明:

    參數

    說明

    spec.type

    後端儲存類型,此處固定為cpfs

    spec.reclaimPolicy

    回收策略。僅支援Retain,刪除CNFS時,CPFS檔案系統不會被刪除。

    spec.parameters.protocolServer

    CPFS通用版協議服務匯出目錄的掛載地址中的掛載點網域名稱。

    spec.parameters.useClient

    配置為NFSClient,使用NFS用戶端進行掛載。

  2. 建立CNFS。

    kubectl apply -f cnfs.yaml
  3. 查看CNFS狀態,確認為Available

    kubectl get cnfs cnfs-nfs-cpfs -o jsonpath='{.status.status}'

步驟二:建立StorageClass

建立StorageClass,作為動態供應的模板,並引用此前建立的CNFS。

  1. 參見代碼,建立sc.yaml

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: cnfs-nfs-cpfs-sc
    # 掛載參數
    mountOptions:  
      - nolock,tcp,noresvport
      - vers=3
    parameters:
      # 建立子目錄類型的 PV
      volumeAs: subpath  
      # 引用此前建立的 CNFS
      containerNetworkFileSystem: "cnfs-nfs-cpfs"  
      # CPFS 通用版協議服務匯出目錄對應路徑
      path: "/share"  
      # 刪除 PVC 時的資料處理策略,true 表示歸檔而非直接刪除
      archiveOnDelete: "true"  
    provisioner: nasplugin.csi.alibabacloud.com
    # PV 回收策略,僅支援 Retain
    reclaimPolicy: Retain  
    # 允許儲存卷擴容
    allowVolumeExpansion: true  

    參數說明:

    參數

    說明

    mountOptions

    掛載參數。預設參考本文樣本即可。

    parameters.volumeAs

    • subpath:子目錄模式。一個PV對應一個CPFS檔案系統的獨立子目錄,便於資料隔離。

    • sharepath:共用目錄模式。所有PV均對應StorageClass中定義的同一個CPFS目錄,所有使用此StorageClass的PVC都指向CPFS上同一個共用目錄。

    parameters.containerNetworkFileSystem

    待引用的CNFS。

    parameters.path

    CPFS通用版協議服務匯出目錄對應路徑,如/share。支援設定為子目錄,如/share/dir

    目前僅支援普通目錄,不支援Fileset

    parameters.archiveOnDelete

    僅在volumeAssubpathreclaimPolicyDelete時生效。
    CPFS通用版為共用儲存,提供此選項進行雙重確認。

    控制刪除PVC後子目錄資料的處理方式。

    • true(預設):子目錄不會被刪除,而是歸檔並重新命名,格式為archived-{pvName}.{timestamp},資料可手動恢複。

    • false:子目錄及其中的檔案會被直接刪除,不可恢複。

      此處刪除的是CPFS的subpath子目錄及其檔案,CPFS檔案系統本身不會被刪除。如需刪除CPFS,請參見刪除檔案系統

    reclaimPolicy

    csi-provisioner為託管版時,版本需為v1.34.1及以上;非託管版無版本限制。
    僅在volumeAssubpath時生效。

    PV的回收策略,控制刪除PVC後的資源處理方式。

    • Delete:刪除PVC時,自動釋放PV。後端子目錄資料是否真正刪除,由archiveOnDelete參數進一步控制。

    • Retain:刪除PVC時,PV保留,後端資料不受影響,需手動清理。適用於對資料安全性要求高的情境。

    allowVolumeExpansion

    啟用後,CPFS儲存卷可自動擴容。

  2. 建立StorageClass。

    kubectl apply -f sc.yaml
  3. 查看StorageClass是否建立成功。

    kubectl get sc cnfs-nfs-cpfs-sc

    預期輸出:

    NAME               PROVISIONER                      RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
    cnfs-nfs-cpfs-sc   nasplugin.csi.alibabacloud.com   Retain          Immediate           true                   9s

步驟三:建立應用並掛載

建立工作負載,並在其volumeClaimTemplates中聲明使用上一步建立的StorageClass。

  1. 參見代碼,建立sts.yaml

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: cnfs-nfs-cpfs-sts
    spec:
      selector:
        matchLabels:
          app: nginx
      serviceName: "nginx"
      replicas: 2
      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:
            - name: pvc
              # 將儲存卷掛載到容器內的 /data 目錄
              mountPath: /data  
      # 定義 PVC 模板,StatefulSet Controller 會為每個 Pod 動態建立一個PVC
      volumeClaimTemplates:
      - metadata:
          name: pvc
        spec:
          accessModes: [ "ReadWriteOnce" ]
          # 引用此前建立的 StorageClass 
          storageClassName: "cnfs-nfs-cpfs-sc"     
          resources:
            requests:
              storage: 50Gi
  2. 建立應用。

    kubectl apply -f sts.yaml
  3. 查看Pod是否進入Running狀態。

    kubectl get pod | grep cnfs-nfs-cpfs-sts

    預期返回:

    cnfs-nfs-cpfs-sts-0   1/1     Running   0          11s
    cnfs-nfs-cpfs-sts-1   1/1     Running   0          9s
  4. 確認Pod已掛載CPFS儲存卷。

    kubectl exec cnfs-nfs-cpfs-sts-0 -- mount | grep nfs

    預期輸出如下,表明CNFS使用NFS用戶端已成功掛載CPFS檔案系統。

    cpfs-********-********.cn-shanghai.cpfs.aliyuncs.com:/share/nas-804e8cb1-2355-4026-87fc-ee061e14f5f9 on /data type nfs (rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,nolock,noresvport,proto=tcp,port=30000,timeo=600,retrans=2,sec=sys,mountaddr=127.XX.XX.255,mountvers=3,mountport=30000,mountproto=tcp,local_lock=all,addr=127.XX.XX.255)

步驟四:結果驗證

應用建立後,系統會自動完成儲存的供應和掛載。

驗證自動供應

查看PVC狀態,確認已自動建立了兩個PVC,並綁定到動態產生的PV。

kubectl get pvc -l app=nginx

預期輸出:

NAME                      STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS       VOLUMEATTRIBUTESCLASS   AGE
pvc-cnfs-nfs-cpfs-sts-0   Bound    nas-8d2530eb-fcf9-4ad5-b5f8-bae02a1*****   50Gi       RWO            cnfs-nfs-cpfs-sc   <unset>                 63s
pvc-cnfs-nfs-cpfs-sts-1   Bound    nas-e84cadaf-ce35-4745-8cbb-2a80026*****   50Gi       RWO            cnfs-nfs-cpfs-sc   <unset>                 61s

驗證Pod運行與掛載

檢查容器內的掛載點,確認CPFS隔離子目錄已掛載成功。

kubectl exec cnfs-nfs-cpfs-sts-0 -- mount | grep /data

預期輸出中掛載路徑包含了自動產生的PV名(例如nas-804e8cb1-xxxx),表明掛載的是隔離子目錄。

cpfs-....aliyuncs.com:/share/nas-804e8cb1-2355-4026-87fc-ee061e1****** on /data type nfs (rw,...)

驗證儲存卷隔離

驗證為不同Pod動態建立的儲存卷是相互隔離的。

  1. cnfs-nfs-cpfs-sts-0中建立一個臨時檔案。

    kubectl exec cnfs-nfs-cpfs-sts-0 -- touch /data/test.txt
  2. cnfs-nfs-cpfs-sts-1中查看/data目錄,確認不存在該測試檔案。

    kubectl exec cnfs-nfs-cpfs-sts-1 -- ls /data

    預期輸出不存在該檔案,表明動態建立的儲存卷是相互隔離的,資料並未共用。

應用於生產環境

  • 效能調優:CPFS適用於高吞吐和高IOPS情境。可在PV的mountOptions中調整NFS掛載參數(如rsizewsize)以最佳化效能,滿足特定工作負載需求。

  • 資料保護:建議在StorageClass中將reclaimPolicy設定為Retain,並將archiveOnDelete設定為true,以防止因誤刪PVC導致後端資料丟失。

資源釋放指引

為避免產生預期外費用並確保資料安全,請遵循以下流程釋放無需使用的資源。

  1. 刪除工作負載

    • 操作:刪除所有使用相關PVC的應用,例如StatefulSet。此操作將停止啟動並執行Pod並卸載儲存卷。

    • 命令樣本:kubectl delete statefulset <your-statefulset-name>

  2. 刪除PVC

    • 操作:刪除應用關聯的PVC。後端資料的處理方式由volumeAsreclaimPolicyarchiveOnDelete共同決定。

      • volumeAs: subpath

        每個PVC對應獨立子目錄,刪除行為如下:

        • reclaimPolicy: Retain:PV保留,CPFS子目錄資料不變,需手動清理。

        • reclaimPolicy: Delete + archiveOnDelete: "true":PV自動釋放。子目錄歸檔重新命名為archived-{pvName}.{timestamp},資料不丟失。

        • reclaimPolicy: Delete + archiveOnDelete: "false":PV自動釋放。子目錄及檔案直接刪除,不可恢複。請謹慎操作。

      • volumeAs: sharepath

        多個PVC共用同一目錄。刪除PVC不會影響後端目錄及資料,reclaimPolicyarchiveOnDelete均不生效。

      無論以上哪種配置,CPFS檔案系統本身均不會被刪除。如需刪除CPFS,請參見刪除檔案系統

    • 命令樣本:kubectl delete pvc <your-pvc-name>

  3. 刪除Kubernetes儲存資源定義

    此操作僅移除叢集內的資源定義,不會刪除後端的CPFS檔案系統。

    1. 刪除PV

      • 操作:若reclaimPolicyRetain,刪除PVC後PV狀態變為Released,如確認資料無需保留,可手動刪除PV。

      • 命令樣本:kubectl delete pv <your-pv-name>

    2. 刪除StorageClass

      • 操作:如不再需要該類型的儲存,可刪除對應的StorageClass。

      • 命令樣本:kubectl delete sc <your-storageclass-name>

    3. 刪除CNFS

      • 操作:如不再需要在叢集中使用該CPFS檔案系統,可刪除CNFS對象。刪除CNFS不會刪除後端CPFS檔案系統。

      • 命令樣本:kubectl delete cnfs <your-cnfs-name>