全部產品
Search
文件中心

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

更新時間:Nov 12, 2025

在ACK中,通過CNFS可將一個共用的CPFS通用版檔案系統,以動態儲存裝置卷的方式為應用提供儲存。配置StorageClass後,工作負載可自動獲得基於CPFS隔離子目錄的獨立PV,從而實現資料隔離,並簡化儲存管理。

前提條件

  • 根據叢集版本,完成以下條件。

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

    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的協議服務掛載點和叢集處於同一交換器下,以提升使用效能。

步驟一:使用NFS用戶端掛載CPFS檔案系統

  1. 參考以下內容,建立一個CNFS託管CPFS檔案系統。

    以下命令將建立一個CNFS和一個StorageClass,通過CNFS隔離卷方式使用NFS用戶端掛載CPFS檔案系統。

    cat << EOF | kubectl apply -f -
    apiVersion: storage.alibabacloud.com/v1beta1
    kind: ContainerNetworkFileSystem
    metadata:
      name: cnfs-nfs-cpfs
    spec:
      type: cpfs
      reclaimPolicy: Retain
      parameters:
        protocolServer: cpfs-xxxx.xxxx.cpfs.aliyuncs.com # 填寫CPFS的協議服務的掛載點網域名稱。
        useClient: NFSClient  # 使用NFS用戶端進行掛載。
    ---
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: cnfs-nfs-cpfs-sc
    mountOptions:
      - nolock,tcp,noresvport
      - vers=3
    parameters:
      volumeAs: subpath
      containerNetworkFileSystem: "cnfs-nfs-cpfs"  # 引用建立的CNFS對象cnfs-nfs-cpfs。
      path: "/share"
      archiveOnDelete: "true"
    provisioner: nasplugin.csi.alibabacloud.com
    reclaimPolicy: Retain
    allowVolumeExpansion: true
    EOF
    • CNFS

      參數

      說明

      type

      需要建立的儲存卷類型。本樣本為cpfs

      reclaimPolicy

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

      parameters

      protocolServer

      填寫CPFS通用版檔案系統的協議服務的掛載點網域名稱。

      useClient

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

    • StorageClass

      參數

      說明

      mountOptions

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

      parameters

      volumeAs

      設定為subpath,表示建立子目錄類型的PV。

      containerNetworkFileSystem

      關聯的CNFS的名稱。

      path

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

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

      parameters.archiveOnDelete

      刪除PVC時,若reclaimPolicyDelete,後端儲存的檔案資料是否被真正刪除。

      CPFS通用版為共用儲存,提供此選項進行雙重確認。
      • true(預設):不會真正刪除目錄或檔案,而是將其歸檔並重新命名,格式為archived-{pvName}.{timestamp}

      • false:後端對應的目錄及資料會被真正刪除。

        此處刪除的是CPFS的subpath目錄以及其中檔案,CPFS本身不會被刪除。

        如需刪除CPFS,請參見刪除檔案系統

      reclaimPolicy

      PV的回收策略。

      • Delete:刪除PVC時,根據archiveOnDelete的配置處理後端儲存資料。

      • Retain:刪除PVC時,PV和CPFS不會被刪除,需手動刪除。適用於對資料安全性要求高的情境,以免誤刪資料。

      allowVolumeExpansion

      選擇性參數。表示允許擴容CPFS儲存卷。

  2. 參考以下內容,建立一個名為cnfs-nfs-cpfs-sts的StatefulSet並掛載CPFS隔離儲存卷。

    cat << EOF | kubectl apply -f -
    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
              mountPath: /data
      volumeClaimTemplates:
      - metadata:
          name: pvc
        spec:
          accessModes: [ "ReadWriteOnce" ]
          storageClassName: "cnfs-nfs-cpfs-sc"     # 綁定的StorageClass名稱。 
          resources:
            requests:
              storage: 50Gi
    EOF
  3. 查看CNFS狀態。

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

    預期返回如下,狀態為Available表示CNFS可用。

    Available
  4. 查看PVC狀態。

    kubectl get pvc -o wide | grep cnfs-nfs-cpfs-sc

    預期返回如下,已自動建立2個PVC,並綁定了自動建立的PV。

    pvc-cnfs-nfs-cpfs-sts-0   Bound    nas-804e8cb1-2355-4026-87fc-ee061e14f5f9   50Gi       RWO            cnfs-nfs-cpfs-sc   <unset>                 5m36s   Filesystem
    pvc-cnfs-nfs-cpfs-sts-1   Bound    nas-00baf7ff-75dc-440d-bab1-ea8872f1adea   50Gi       RWO            cnfs-nfs-cpfs-sc   <unset>                 5m25s   Filesystem
  5. 查看Pod狀態。

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

    預期返回:

    NAME                  READY   STATUS    RESTARTS   AGE
    cnfs-nfs-cpfs-sts-0   1/1     Running   0          9m22s
    cnfs-nfs-cpfs-sts-1   1/1     Running   0          9m11s
  6. 確認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.0.1.255,mountvers=3,mountport=30000,mountproto=tcp,local_lock=all,addr=127.0.1.255)

步驟二:驗證儲存卷是否相互隔離

  1. 將1G的臨時檔案寫入其中一個名稱為cnfs-xxx-cpfs-sts-0的Pod中,並查看是否寫入成功。

    請使用實際Pod名稱替換cnfs-xxx-cpfs-sts-0

    kubectl exec cnfs-xxx-cpfs-sts-0 -- sh -c "dd if=/dev/zero of=/data/1G.tmpfile bs=1G count=1;ls -alrth /data"

    預期返回:

    1+0 records in
    1+0 records out
    1073741824 bytes (1.1 GB, 1.0 GiB) copied, 2.2487 s, 477 MB/s
    total 1.1G
    drwxr-xr-x 1 root root 4.0K Aug  5 08:46 ..
    drwxr-xr-x 2 root root 4.0K Aug  5 09:10 .
    -rw-r--r-- 1 root root 1.0G Aug  5 09:10 1G.tmpfile
  2. 在名稱為cnfs-xxx-cpfs-sts-1的Pod中,確認並不存在1G的臨時檔案。

    請使用實際Pod名稱替換cnfs-xxx-cpfs-sts-1

    kubectl exec cnfs-xxx-cpfs-sts-1 -- sh -c "ls -alrth /data"

    預期返回如下,在名稱為cnfs-xxx-cpfs-sts-1的Pod中並不存在1G的臨時檔案,即StatefulSet中的2個Pod所使用的儲存卷相互隔離。

    total 4.5K
    drwxr-xr-x 2 root root 4.0K Aug  5 08:46 .
    drwxr-xr-x 1 root root 4.0K Aug  5 08:46 ..