全部產品
Search
文件中心

Container Service for Kubernetes:使用CPFS通用版靜態儲存卷

更新時間:Mar 06, 2026

CPFS是一種高吞吐、高IOPS的並行檔案系統,適用於AI訓練、自動駕駛等Alibaba Cloud HPC情境。在ACK叢集中,多個Pod可以掛載同一個CPFS通用版靜態儲存卷,以實現高效能的資料共用和持久化儲存。

工作原理

在ACK叢集中掛載CPFS通用版靜態儲存卷主要流程如下。

image
  1. 建立PV:在叢集中“註冊”已有的CPFS通用版,聲明其掛載地址、容量、訪問模式等。

  2. 建立PVC:應用通過PVC來“申請”使用登入的儲存資源。PVC會與合格PV自動綁定。

  3. 在應用中掛載:將已綁定的PVC掛載到應用Pod中,作為容器內的一個持久化目錄。

準備工作

  • 檢查並升級CSI組件:已確保csi-plugin和csi-provisioner組件版本不低於v1.22.11-abbb810e-aliyun。

    如需升級,請參見升級CSI組件
  • 已配置儲存群組件,以支援CPFS的掛載。

    配置流程

    根據csi-plugin的版本選擇不同的配置方式。

    1.33及以上

    安裝cnfs-nas-daemon組件,並配置csi-plugin開啟AlinasMountProxy=true FeatureGate,使得CSI後續調用cnfs-nas-daemon進行掛載。具體操作,請參見管理cnfs-nas-daemon組件

    1.33以下

    1. 配置ConfigMap,開啟掛載CPFS通用版時使用的NFS協議。

      cat << EOF | kubectl apply -f -
      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: csi-plugin
        namespace: kube-system
      data:
        cpfs-nas-enable: "true"   # 使用CPFS通用版掛載時,使用NFS協議。
      EOF
    2. 重啟csi-plugin,安裝相關依賴。

      此操作不影響業務正常運行。

      kubectl -n kube-system rollout restart daemonset csi-plugin

      預期輸出:

      daemonset.apps/csi-plugin restarted
  • 已準備CPFS通用版檔案系統、協議服務和可供ACK叢集掛載的掛載地址。

    如未建立,請在叢集所屬地區建立CPFS通用版檔案系統,使用叢集對應的VPC和交換器建立協議服務,並產生掛載點。

    • 檔案系統:為CPFS通用版開服地區,且與叢集位於同一地區,版本為2.3.0及以上。

      NAS控制台檔案系統列表頁面單擊目標CPFS檔案系統,在基本資料頁面確認CPFS版本號碼。
    • 協議服務:CPFS不支援跨VPC掛載,使用的VPC需與叢集一致。

    • 已擷取服務合約的掛載地址(由掛載點網域名稱和匯出目錄組成)。如指定匯出 / 目錄,則掛載地址為cpfs-****.<Region ID>.cpfs.aliyuncs.com:/share

      協議服務頁面,單擊匯出目錄,在掛載地址列複製並儲存掛載地址。
  • 已瞭解CPFS通用版的使用限制

步驟一:建立PV

在叢集中建立PV,用於“註冊”已有的CPFS檔案系統。

  1. 將以下內容儲存為cpfs-pv.yaml檔案。

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: cpfs-pv
      labels:  # 定義標籤,用於後續PVC綁定
        alicloud-pvname: cpfs-pv
    spec:
      accessModes:  # 訪問模式
      - ReadWriteMany
      capacity:
        storage: 20Gi  # 定義PV的總容量
      csi:
        driver: nasplugin.csi.alibabacloud.com  # 固定為此值
        volumeAttributes:
          mountProtocol: cpfs-nfs   # 使用NFS協議進行掛載
          path: "/share"    # 掛載地址中的掛載目錄
          volumeAs: subpath    # 子目錄
          server: "cpfs-******-******.cn-shanghai.cpfs.aliyuncs.com" # 掛載地址中的掛載點網域名稱
        volumeHandle: cpfs-pv  # 卷的唯一識別碼,與metadata.name保持一致       
      mountOptions:  # NFS掛載參數
      - rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport
      - vers=3

    核心參數說明:

    參數

    說明

    accessModes

    PV的訪問模式。

    capacity.storage

    聲明儲存卷容量。

    csi.driver

    驅動類型,使用CPFS通用版時固定為nasplugin.csi.alibabacloud.com

    csi.volumeAttributes.server

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

    csi.volumeAttributes.path

    CPFS通用版協議服務匯出目錄的掛載地址中的掛載目錄,例如/share。支援設定為子目錄,例如/share/dir

    csi.volumeAttributes.mountProtocol

    cpfs-nfs表示使用NFS協議掛載CPFS。

    csi.volumeAttributes.volumeAs

    subpath表示建立子目錄類型的PV。

    csi.volumeHandle

    與PV Name保持一致。

  2. 執行以下命令建立PV。

    kubectl apply -f cpfs-pv.yaml
  3. 查看PV狀態。

    kubectl get pv cpfs-pv

    預期輸出:

    NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
    cpfs-pv   20Gi       RWX            Retain           Available                                   2s

步驟二:建立PVC

建立PVC,用於“申請”使用上一步註冊的儲存資源。

  1. 將以下內容儲存為cpfs-pvc.yaml。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: cpfs-pvc
    spec:
      accessModes:
      - ReadWriteMany  # 訪問模式
      resources:
        requests: 
          storage: 20Gi  # 請求的儲存容量
      selector:  # 
        matchLabels:
          alicloud-pvname: cpfs-pv  # 精確綁定此前建立的PV

    參數

    說明

    accessModes

    PVC請求PV的訪問模式。

    selector

    使用PV上的Label進行匹配綁定。

    resources.requests.storage

    分配給Pod的儲存容量。不大於PV容量即可。

  2. 建立PVC。

    kubectl apply -f cpfs-pvc.yaml
  3. 查看PVC狀態,確認已與PV成功綁定。

    kubectl get pvc cpfs-pvc

    返回樣本如下:

    NAME       STATUS   VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
    cpfs-pvc   Bound    cpfs-pv   20Gi       RWO                           <unset>                 18m

步驟三:建立應用並掛載

建立應用負載,並在其配置中聲明使用此前建立的PVC。

  1. 將以下內容儲存為cpfs-test.yaml。

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: 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: cpfs-pvc
              mountPath: /data  # 將儲存卷掛載到容器內的/data目錄
          volumes:
          - name: cpfs-pvc
            persistentVolumeClaim:
              claimName: cpfs-pvc  # 引用此前建立的PVC
  2. 建立StatefulSet。

    kubectl apply -f cpfs-test.yaml
  3. 查看Pod狀態。

    kubectl get pods -l app=nginx

    預期輸出:

    NAME         READY   STATUS    RESTARTS   AGE
    cpfs-sts-0   1/1     Running   0          58s
    cpfs-sts-1   1/1     Running   0          50s
  4. 檢查容器內的掛載點,確認CPFS已掛載成功。

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

    預期輸出如下,說明CPFS通用版靜態卷掛載成功。

    cpfs-******-******.cn-shanghai.cpfs.aliyuncs.com:/share 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)

驗證共用儲存和持久化儲存

成功部署應用後,可驗證儲存卷是否按預期工作。

共用儲存

在一個Pod中建立檔案,然後另一個Pod中查看,驗證資料的共用儲存。

  1. 查看Pod資訊,擷取Pod名稱。

    kubectl get pod -l app=nginx

    預期輸出:

    NAME         READY   STATUS    RESTARTS   AGE
    cpfs-sts-0   1/1     Running   0          10s
    cpfs-sts-1   1/1     Running   0          5s
  2. 在一個Pod中建立檔案。

    以名為cpfs-sts-0的Pod作為樣本:

    kubectl exec cpfs-sts-0 -- touch /data/test.txt
  3. 在另一個Pod中查看檔案是否存在。

    以名為cpfs-sts-1的Pod為例。

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

    預期輸出:

    test.txt

    可以查看到此前建立的檔案,表明資料可在多Pod間共用。

持久化儲存

重建Deployment,在建立Pod中查看檔案系統中的資料是否存在,驗證資料的持久化儲存。

  1. 刪除應用Pod以觸發重建。

    kubectl rollout restart sts cpfs-sts
  2. 查看Pod,等待新Pod啟動並進入Running狀態。

    kubectl get pod -l app=nginx

    預期輸出:

    NAME         READY   STATUS    RESTARTS   AGE
    cpfs-sts-0   1/1     Running   0          1s
    cpfs-sts-1   1/1     Running   0          10s
  3. 在新Pod中查看此前建立的檔案是否存在。

    以名為cpfs-sts-0的Pod為例。

    kubectl exec cpfs-sts-0 -- ls /data

    預期輸出:

    test.txt

    可以查看到此前寫入的檔案,表明資料可持久化儲存。

生產環境使用建議

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

  • 資料一致性:CPFS作為共用儲存,不保證多個Pod並發寫入同一檔案的資料一致性。為避免檔案損壞,需在應用程式層面自行實現分布式鎖或採用僅追加(Append-only)的寫入模式。

  • 儲存卷管理:靜態儲存卷的方式需手動管理PV。對於需要為多個應用自動建立、隔離儲存卷的情境,推薦使用CNFS管理CPFS動態儲存裝置卷,請參見管理CPFS通用版動態儲存裝置卷