全部產品
Search
文件中心

Container Service for Kubernetes:使用CPFS智算版動態儲存裝置卷

更新時間:Jan 22, 2026

通過動態磁碟區機制,可為 CPFS 智算版實現自動化按需儲存,免去手動管理 PV 的繁瑣。該方法支援多應用並行讀寫,尤其適用於 AI 訓練、巨量資料分析等情境,可高效共用代碼、設定檔、計算中間結果等資料。

準備工作

  • 已瞭解CPFS智算版的CPFS智算版使用限制

  • 確保叢集滿足以下條件:

    • 叢集版本:1.26及以上版本。如需升級叢集,請參見手動升級叢集

    • 節點作業系統:Alibaba Cloud Linux 3。

    • 已安裝以下儲存群組件,且版本滿足要求。

      可在叢集的組件管理頁面,確認組件版本、安裝或升級組件。
      • CSI組件(csi-plugincsi-provisioner):v1.33.1及以上版本。如需升級,請參見管理CSI組件

      • cnfs-nas-daemon組件:0.1.2及以上版本。

        展開查看cnfs-nas-daemon介紹

        cnfs-nas-daemon負責管理EFC進程,其資源消耗較高,並直接影響儲存效能。可在組件管理頁面調整其資源配置,推薦的調整策略如下:

        • CPU:CPU請求量與節點總頻寬相關。計算規則為:每1Gb/s頻寬需分配0.5 Core,並額外增加1 Core用於中繼資料管理。請根據此規則調整CPU配置。

          例如,對於一個配置了100Gb/s網卡的節點,推薦的CPU請求量為 100 * 0.5 + 1 = 51 Cores。
        • Memory:CPFS智算版通過FUSE訪問,其資料讀寫緩衝及檔案中繼資料均佔用記憶體。推薦將記憶體請求量設定為節點總記憶體的15%。

        配置調整後,可根據實際負載情況進行動態擴縮。

        重要
        • 更新生效方式:cnfs-nas-daemon DaemonSet預設更新策略為OnDelete。在組件管理頁面調整其CPU或Memory後,需手動刪除節點上原有的cnfs-nas-daemon Pod,以觸發重建使新配置生效。

          為確保業務穩定性,建議在業務低峰期執行此操作。

        • 操作風險:刪除或重啟 cnfs-nas-daemon Pod 會臨時中斷該節點上的CPFS掛載服務。

          • 不支援掛載點熱升級的節點:此操作為硬中斷,將導致應用Pod運行異常。需手動刪除應用Pod,等待應用Pod重啟後恢複。

          • 支援熱升級的節點:應用Pod可在cnfs-nas-daemon Pod重啟後自動回復。

          ①:符合以下條件的節點支援熱升級:

          • 節點系統核心為5.10.134-18及以上

          • bmcpfs-csi-controller和bmcpfs-csi-plugin版本為 1.35.1 及以上

          • cnfs-nas-daemon版本為0.1.9-compatible.1及以上

      • bmcpfs-csi組件:1.35.1及以上

        包括bmcpfs-csi-controller(控制面組件,由ACK託管)和bmcpfs-csi-node(節點側組件,以DaemonSet形式部署在叢集中)。

注意事項

  • 使用VSC掛載時,運行 Pod 的節點必須與 CPFS 智算版檔案系統執行個體處於同一 hpn-zone。

  • 靈駿節點在初始化的時候必須與某一個 CPFS 智算版關聯,否則無法使用 CSI 進行掛載。

  • 靈駿節點出現故障需要下線前,必須先執行Pod排水(drain)操作。否則,將導致叢集元資訊不一致,造成Pod資源殘留且無法被正常回收。

  • 不支援在同一個Pod中掛載多個源於同一個CPFS智算版檔案系統的儲存卷(即由包含相同 bmcpfsId 的StorageClass所建立的多個PV)。由於原生協議的限制,當同一個Pod嘗試多次掛載同一個檔案系統執行個體時(即使是不同子目錄),會導致預期外行為。

步驟一:建立CPFS檔案系統

  1. 參見建立CPFS智算版檔案系統建立CPFS檔案系統,並記錄檔案系統ID。

  2. (可選)如需在非靈駿節點實現掛載,請建立VPC掛載點(與叢集節點所在的VPC一致),並記錄掛載點網域名稱。格式為cpfs-***-vpc-***.<Region>.cpfs.aliyuncs.com

    如果Pod將調度到靈駿節點,則預設使用VSC掛載,無需此步驟。

步驟二:建立 StorageClass

建立StorageClass對象作為儲存模板。

  1. 使用以下內容,建立sc.yaml

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: alicloud-bmcpfs-test
    provisioner: bmcpfsplugin.csi.alibabacloud.com
    parameters:
      # CPFS 智算版檔案系統 ID
      bmcpfsId: bmcpfs-29000z8xz3lf5nj*****  
      # 指定檔案系統內的子路徑
      # path: "/shared"  
    # 允許後續擴容
    allowVolumeExpansion: true  
    # Delete(自動清理)或 Retain(保留資料)
    reclaimPolicy: Delete  

    參數說明:

    參數

    是否必填

    說明

    bmcpfsId

    BMCPFS 檔案系統 ID,格式如 bmcpfs-xxxxxxxxxcpfs-xxxxxxxxx

    path

    檔案系統內的子路徑。

    • 指定時:卷將建立在 {path}/{volumeName}/ 路徑下

    • 不指定時:卷將建立在 /{volumeName}/ 路徑下。

    allowVolumeExpansion

    是否允許後續通過 PVC 自動擴容。

    目前的版本不支援動態擴容,此為預留參數。

    reclaimPolicy

    • Delete(預設):刪除 PVC 時自動刪除後端檔案系統中的檔案集(Fileset)。

    • Retain:刪除 PVC 時保留後端檔案系統中的檔案集(Fileset),需手動清理。生產環境建議使用。

  2. 建立StorageClass。

    kubectl apply -f sc.yaml

步驟三:建立 PVC

應用通過PVC申請儲存卷,並引用StorageClass作為配置模板。

  1. 使用以下內容,建立pvc.yaml

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: bmcpfs-vsc
      namespace: default
    spec:
      accessModes:
        # CPFS 智算版儲存卷支援多 Pod 同時讀寫
        - ReadWriteMany  
      resources:
        requests:
          # 支援大型存放區(Ti 層級)
          storage: 10Ti  
      # 僅支援 Filesystem
      volumeMode: Filesystem
      # 指定此前建立的 StorageClass
      storageClassName: alicloud-bmcpfs-test

    參數說明:

    以下參數均為必填

    參數

    說明

    accessModes

    僅支援 ReadWriteMany,即多 Pod 同時進行掛載和讀寫。

    storage

    請求的儲存容量,支援 Gi、Ti 等單位。

    volumeMode

    僅支援 Filesystem

    storageClassName

    指定使用的 StorageClass ,以觸發儲存卷的動態建立。

  2. 建立PVC。

    kubectl apply -f pvc.yaml
  3. 執行以下命令,確認PVC狀態。

    • 可執行kubectl get pvc bmcpfs-vsc -n default查看PVC狀態。若STATUSBound,表明系統已為其自動建立了對應的 PV。

    • 可執行kubectl describe pvc bmcpfs-vsc -n default,在 Events 中查看 Provisioning succeeded的成功資訊。

步驟四:建立工作負載並掛載PVC

PVC建立後,部署樣本工作負載,將PVC綁定的 PV 掛載到應用中。

  1. 使用以下內容,建立deploy.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: cpfs-shared-example
    spec:
      # 建立 3 個副本,驗證多 Pod 共用儲存
      replicas: 3
      selector:
        matchLabels:
          app: cpfs-shared-app
      template:
        metadata:
          labels:
            app: cpfs-shared-app
        spec:
          # 確保Pod可以被調度到靈駿節點上
          tolerations:
            - key: node-role.alibabacloud.com/lingjun
              operator: Exists
              effect: NoSchedule
          # 可選:如需將所有Pod調度到指定節點,可取消此行注釋並修改節點名稱
          # nodeName: cn-hangzhou.10.XX.XX.226
          containers:
          - name: app-container
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
            volumeMounts:
              - name: pvc-cpfs
                # 將共用儲存卷掛載到容器內的 /data 目錄
                mountPath: /data
            # 簡單的生命週期命令,用於驗證資料寫入和共用
            # Pod啟動後,會向共用目錄寫入一個包含自身主機名稱的檔案
            lifecycle:
              postStart:
                exec:
                  command:
                    - /bin/sh
                    - -c
                    - >
                      echo "Data written by $(hostname)" > /data/$(hostname).txt && 
                      echo "Deployment is running, check shared data in /data." && 
                      sleep 3600
          volumes:
            - name: pvc-cpfs
              persistentVolumeClaim:
                # 引用此前建立的 PVC
                claimName: bmcpfs-vsc
  2. 建立Deployment。

    kubectl apply -f deploy.yaml

資源釋放指引

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

  1. 刪除工作負載

    • 操作:刪除所有使用相關 PVC 的應用,如 Deployment、StatefulSet 等,以停止應用並卸載儲存卷。

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

  2. 刪除 PVC

    • 操作:刪除應用關聯的 PVC。後端資料的處理結果取決於 StorageClass 的回收策略(reclaimPolicy)。

      • Retain(推薦):刪除 PVC 後,後端 CPFS 智算版的檔案集和資料會完整保留。

      • Delete:刪除 PVC 後,其綁定的 PV 和後端 CPFS 智算版的檔案集將被永久刪除。此操作無法復原,請謹慎使用。

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

  3. 刪除 PV(回收策略為 Retain時)

    • 操作:如果回收策略為 Retain,刪除 PVC 後 PV 變為 Released 狀態。此時需要手動刪除 PV。此操作僅移除 Kubernetes 中的資源定義,不影響後端資料。

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

  4. 刪除 StorageClass(可選)

    • 操作:如果不再需要該儲存類型,可刪除 StorageClass。此操作不影響已建立的卷。

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

  5. 刪除後端 CPFS 智算版檔案系統

    • 操作:此操作將永久刪除該檔案系統上的所有資料(包括 Retain 策略保留的資料),且無法恢複。執行前,請務必確認該檔案系統已無任何業務依賴,詳見刪除檔案系統

常見問題

為什麼 PVC 一直處於 Pending 狀態?

PVC 處於 Pending 狀態通常表示動態儲存裝置卷的建立(Provisioning)失敗。請遵循以下步驟排查。

  1. 檢查 PVC 事件,通常會直接說明失敗原因。

    kubectl describe pvc <your-pvc-name> -n <your-namespace>

    關注 Events 部分的警示資訊。常見原因如下:

    • StorageClass not foundstorageClassName 欄位填寫錯誤或對應的 StorageClass 不存在。

    • provisioning failedfailed to create fileset:與後端儲存互動存在問題,請繼續執行後續流程。

  2. 檢查 StorageClass 和 CSI 驅動配置

    如果事件記錄指向配置問題,或沒有明確錯誤,請檢查 StorageClass 的配置和 CSI 驅動的狀態。

    # 1. 檢查 StorageClass 的 YAML 配置
    kubectl get storageclass <your-sc-name> -o yaml
    
    # 2. 檢查 CSI 驅動是否已在叢集中註冊
    kubectl get csidriver bmcpfsplugin.csi.alibabacloud.com

    需確認:

    • StorageClass 配置:provisioner 欄位正確,parameters 中的 bmcpfsId 已正確填寫且檔案系統 ID 真實存在。

    • bmcpfs-csi 狀態:如果 get csidriver 命令報錯或無返回,表明驅動未正確安裝。請在叢集的組件管理頁面安裝bmcpfs-csi-controller、bmcpfs-csi-node和cnfs-nas-daemon。

Pod 一直處於 ContainerCreating 狀態,或者事件中出現 MountVolume.Setup failed 錯誤,該如何排查?

此錯誤表示 Pod 已經被調度到某個節點,但在節點上掛載儲存卷時失敗。請遵循以下排查流程。

  1. 查看 Pod 事件,定位原因

    通過 describe pod 命令查看 Pod 的事件記錄。

    kubectl describe pod <pod-name> -n <your-namespace>

    重點關注 Events 部分的 Warning 資訊,例如 FailedMountMountVolume.Setup failed

  2. 檢查掛載的前提條件

    確認 PVC 狀態為 Bound:Pod 只能掛載已經成功綁定的儲存卷。

    kubectl get pvc <your-pvc-name>

    PVC 的 STATUS 需為 Bound。如果為 Pending,表明儲存卷建立階段存在問題,請參見為什麼 PVC 一直處於 Pending 狀態?

  3. 檢查節點 CSI 外掛程式的詳細日誌

    如果 PVC 已 Bound 且 Pod 位於正確的節點上,進一步確認節點側的 csi-plugin 組件的執行掛載操作。

    # 查看 Pod 所在節點上 csi-plugin 的日誌,以擷取最終的失敗原因
    kubectl get pods -n kube-system -l app.kubernetes.io/name=bmcpfs-csi-driver   --field-selector spec.nodeName=<nodeName>   -o name | xargs kubectl logs -n kube-system -c csi-plugin

    此日誌會包含最底層的錯誤資訊,例如從節點到儲存後端的網路連接問題、掛載點許可權問題,或是底層的 I/O 錯誤等。