通過動態磁碟區機制,可為 CPFS 智算版實現自動化按需儲存,免去手動管理 PV 的繁瑣。該方法支援多應用並行讀寫,尤其適用於 AI 訓練、巨量資料分析等情境,可高效共用代碼、設定檔、計算中間結果等資料。
準備工作
已瞭解CPFS智算版的CPFS智算版使用限制。
確保叢集滿足以下條件:
叢集版本:1.26及以上版本。如需升級叢集,請參見手動升級叢集。
節點作業系統:Alibaba Cloud Linux 3。
已安裝以下儲存群組件,且版本滿足要求。
可在叢集的組件管理頁面,確認組件版本、安裝或升級組件。
CSI組件(csi-plugin和csi-provisioner):v1.33.1及以上版本。如需升級,請參見管理CSI組件。
cnfs-nas-daemon組件:0.1.2及以上版本。
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檔案系統
參見建立CPFS智算版檔案系統建立CPFS檔案系統,並記錄檔案系統ID。
(可選)如需在非靈駿節點實現掛載,請建立VPC掛載點(與叢集節點所在的VPC一致),並記錄掛載點網域名稱。格式為
cpfs-***-vpc-***.<Region>.cpfs.aliyuncs.com。如果Pod將調度到靈駿節點,則預設使用VSC掛載,無需此步驟。
步驟二:建立 StorageClass
建立StorageClass對象作為儲存模板。
使用以下內容,建立
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-xxxxxxxxx或cpfs-xxxxxxxxx。path否
檔案系統內的子路徑。
指定時:卷將建立在
{path}/{volumeName}/路徑下不指定時:卷將建立在
/{volumeName}/路徑下。
allowVolumeExpansion否
是否允許後續通過 PVC 自動擴容。
目前的版本不支援動態擴容,此為預留參數。
reclaimPolicy否
Delete(預設):刪除 PVC 時自動刪除後端檔案系統中的檔案集(Fileset)。Retain:刪除 PVC 時保留後端檔案系統中的檔案集(Fileset),需手動清理。生產環境建議使用。
建立StorageClass。
kubectl apply -f sc.yaml
步驟三:建立 PVC
應用通過PVC申請儲存卷,並引用StorageClass作為配置模板。
使用以下內容,建立
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,以觸發儲存卷的動態建立。建立PVC。
kubectl apply -f pvc.yaml執行以下命令,確認PVC狀態。
可執行
kubectl get pvc bmcpfs-vsc -n default查看PVC狀態。若STATUS為Bound,表明系統已為其自動建立了對應的 PV。可執行
kubectl describe pvc bmcpfs-vsc -n default,在Events中查看Provisioning succeeded的成功資訊。
步驟四:建立工作負載並掛載PVC
PVC建立後,部署樣本工作負載,將PVC綁定的 PV 掛載到應用中。
使用以下內容,建立
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建立Deployment。
kubectl apply -f deploy.yaml
資源釋放指引
為避免產生預期外費用並確保資料安全,請遵循以下流程釋放無需使用的資源。
刪除工作負載
操作:刪除所有使用相關 PVC 的應用,如 Deployment、StatefulSet 等,以停止應用並卸載儲存卷。
命令樣本:
kubectl delete deployment <your-deployment-name>
刪除 PVC
操作:刪除應用關聯的 PVC。後端資料的處理結果取決於
StorageClass的回收策略(reclaimPolicy)。Retain(推薦):刪除 PVC 後,後端 CPFS 智算版的檔案集和資料會完整保留。Delete:刪除 PVC 後,其綁定的 PV 和後端 CPFS 智算版的檔案集將被永久刪除。此操作無法復原,請謹慎使用。
命令樣本:
kubectl delete pvc <your-pvc-name>
刪除 PV(回收策略為
Retain時)操作:如果回收策略為
Retain,刪除 PVC 後 PV 變為Released狀態。此時需要手動刪除 PV。此操作僅移除 Kubernetes 中的資源定義,不影響後端資料。命令樣本:
kubectl delete pv <your-pv-name>
刪除 StorageClass(可選)
操作:如果不再需要該儲存類型,可刪除
StorageClass。此操作不影響已建立的卷。命令樣本:
kubectl delete sc <your-sc-name>
刪除後端 CPFS 智算版檔案系統
操作:此操作將永久刪除該檔案系統上的所有資料(包括
Retain策略保留的資料),且無法恢複。執行前,請務必確認該檔案系統已無任何業務依賴,詳見刪除檔案系統。
常見問題
為什麼 PVC 一直處於 Pending 狀態?
PVC 處於 Pending 狀態通常表示動態儲存裝置卷的建立(Provisioning)失敗。請遵循以下步驟排查。
檢查 PVC 事件,通常會直接說明失敗原因。
kubectl describe pvc <your-pvc-name> -n <your-namespace>關注
Events部分的警示資訊。常見原因如下:StorageClass not found:storageClassName欄位填寫錯誤或對應的 StorageClass 不存在。provisioning failed或failed to create fileset:與後端儲存互動存在問題,請繼續執行後續流程。
檢查 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 已經被調度到某個節點,但在節點上掛載儲存卷時失敗。請遵循以下排查流程。
查看 Pod 事件,定位原因
通過
describe pod命令查看 Pod 的事件記錄。kubectl describe pod <pod-name> -n <your-namespace>重點關注
Events部分的Warning資訊,例如FailedMount或MountVolume.Setup failed。檢查掛載的前提條件
確認 PVC 狀態為
Bound:Pod 只能掛載已經成功綁定的儲存卷。kubectl get pvc <your-pvc-name>PVC 的
STATUS需為Bound。如果為Pending,表明儲存卷建立階段存在問題,請參見為什麼 PVC 一直處於 Pending 狀態?。檢查節點 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 錯誤等。