CPFS 智算版支援多個 Pod 以 ReadWriteMany 模式同時掛載同一檔案系統,實現訓練資料和模型的共用訪問。本文介紹如何通過 ACK CSI 外掛程式,將 CPFS 智算版以靜態儲存卷方式掛載到容器中。
準備工作
已建立 ACK 靈駿託管版叢集,叢集版本 Kubernetes 1.26 及以上,節點作業系統為 Alibaba Cloud Linux 3。
已建立 CPFS 智算版檔案系統,並記錄檔案系統 ID。具體操作,參見建立CPFS智算版檔案系統。
ACK 叢集已安裝以下儲存群組件,可在叢集的組件管理頁面確認版本或管理CSI組件:
組件
版本要求
csi-plugin / csi-provisioner
≥ v1.33.1
cnfs-nas-daemon
≥ 0.1.2
bmcpfs-csi-controller / bmcpfs-csi-node
ACK 託管,無需手動安裝
Pod 調度到非靈駿節點或跨存算親和域靈駿節點時,需預先建立 VPC 掛載點,並記錄掛載點網域名稱(格式為
cpfs-***-vpc-***.<Region>.cpfs.aliyuncs.com)。VPC 掛載點所屬 VPC 必須與 ACK 叢集 VPC 一致。具體操作,參見管理VPC掛載點。
注意事項
使用VSC掛載時,運行 Pod 的節點必須與 CPFS 智算版檔案系統執行個體處於同一存算親和域。
如使用CSI容器掛載CPFS方式,需在建立靈駿節點分組時,選擇支援高效能檔案儲存體訪問
靈駿節點出現故障需要下線前,必須先執行Pod排水(drain)操作。否則,將導致叢集元資訊不一致,造成Pod資源殘留且無法被正常回收。
不支援在同一個Pod中通過多個PV掛載源於同一個CPFS執行個體的不同子目錄。由於底層驅動的限制,此類配置會導致Pod掛載失敗而無法啟動。
推薦僅為該CPFS執行個體建立一個PV/PVC,然後在Pod的
volumeMounts配置中使用subPath欄位來分別掛載所需的子目錄。subPath基於輕量級的bind mount機制實現,不會帶來額外效能開銷。
訪問通道與調度說明
ACK 靈駿叢集中,Pod 訪問 CPFS 智算版的網路通道由 Pod 調度位置決定,CSI 外掛程式自動選擇最優通道:
Pod 調度位置 | 訪問通道 | 典型情境 |
同存算親和域的靈駿 GPU 節點 | VSC + RDMA(效能最優) | GPU 訓練任務 |
跨存算親和域的靈駿節點 | 自動切換至 VPC 掛載點(TCP) | 跨域調度的訓練或推理任務 |
非靈駿節點(CPU 節點池) | VPC 掛載點(TCP) | CPU Pod:資料預先處理、推理服務、調度管理等 |
要啟用自動通道切換,需在 PV 的 volumeAttributes 中同時配置 mountpointAutoSwitch: "true" 和 vpcMountTarget(VPC 掛載點網域名稱)。配置方法參見下方步驟一:建立PV和PVC。
如何判斷靈駿節點與 CPFS 是否處於同一存算親和域,請參見掛載訪問概述。
步驟一:建立PV和PVC
基於已有的CPFS檔案系統,建立對應的PV和PVC。
修改以下YAML樣本,儲存為bmcpfs-pv-pvc.yaml。
apiVersion: v1 kind: PersistentVolume metadata: name: bmcpfs spec: accessModes: - ReadWriteMany capacity: storage: 10Ti claimRef: name: bmcpfs namespace: default csi: driver: bmcpfsplugin.csi.alibabacloud.com volumeAttributes: # 如果Pod調度至非靈駿節點,或者開啟了跨域自動切換vpc能力,此項為必填,否則掛載會失敗 vpcMountTarget: cpfs-***-vpc-***.<Region>.cpfs.aliyuncs.com # 如果Pod調度到與當前 bmcpfs 所在的不同可用性區域的節點, 則自動使用 vpcMountTarget 掛載點訪問 cpfs 儲存 mountpointAutoSwitch: "true" # 將volumeHandle替換為CPFS智算版檔案系統ID volumeHandle: bmcpfs-***** mountOptions: [] --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: bmcpfs namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 10Ti volumeMode: Filesystem volumeName: bmcpfsPV參數
參數
說明
accessModesPV的訪問模式。
capacity.storage聲明儲存卷容量。僅作聲明,不影響實際容量。
csi.driver驅動類型。掛載CPFS智算版時,固定為
bmcpfsplugin.csi.alibabacloud.com。csi.volumeAttributes.vpcMountTargetCPFS的VPC掛載點網域名稱。置空會導致在非靈駿節點上掛載失敗。
如果Pod調度至靈駿節點,則無需設定。
csi.volumeAttributes.mountpointAutoSwitch是否允許 bmcpfs 在 vsc 掛載點(預設建立&擷取)和 vpc 掛載點(需指定)之間自動切換
與
csi.volumeAttributes.vpcMountTarget綁定使用csi.volumeHandleCPFS檔案系統的ID。
mountOptions掛載參數。
PVC參數
參數
說明
accessModesPVC請求PV的訪問模式,需與PV匹配。
resources.requests.storage分配給Pod的儲存容量。不大於PV容量。
volumeMode掛載模式,需設定為
Filesystem。volumeNamePVC要綁定的PV名稱。
建立PV和PVC。
kubectl apply -f bmcpfs-pv-pvc.yaml
確認PVC已綁定PV。
kubectl get pvc bmcpfs預期輸出:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE bmcpfs Bound bmcpfs 10Ti RWX <unset> 51sSTATUS為Bound,PV和PVC綁定成功。
步驟二:建立應用並掛載 CPFS
情境一:掛載整個CPFS檔案系統
此情境將整個CPFS檔案系統掛載到容器中。
使用以下YAML內容,建立
cpfs-test.yaml檔案,聲明掛載CPFS智算版靜態儲存卷。apiVersion: apps/v1 kind: Deployment metadata: name: cpfs-test labels: app: cpfs-test spec: replicas: 2 selector: matchLabels: app: cpfs-test template: metadata: labels: app: cpfs-test spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 volumeMounts: - name: pvc-cpfs mountPath: /data volumes: - name: pvc-cpfs persistentVolumeClaim: claimName: bmcpfs建立Deployment。
kubectl create -f cpfs-test.yaml查看Pod部署情況。
kubectl get pod -l app=cpfs-test預期輸出:
NAME READY STATUS RESTARTS AGE cpfs-test-76b77d64b5-2hw96 1/1 Running 0 42s cpfs-test-76b77d64b5-dnwdx 1/1 Running 0 42s進入任一Pod,驗證CPFS智算版靜態儲存卷是否掛載成功。
kubectl exec -it <pod-name> -- mount | grep /data預期輸出如下,表明CPFS智算版靜態儲存卷掛載成功。
bindroot-f0a5c-******:cpfs-*******-vpc-****.cn-shanghai.cpfs.aliyuncs.com:/ on /data type fuse.aliyun-alinas-efc (rw,relatime,user_id=0,group_id=0,default_permissions,allow_other,max_read=1048576)
情境二:掛載整個CPFS檔案系統的子目錄
在共用儲存情境中,如需實現多租戶或多任務的資料隔離,讓多個應用Pod 共用同一個 CPFS 卷,但又各自擁有獨立目錄時,可通過 volumeMounts.subPath 來實現。
參見以下內容,建立 pod.yaml。Pod包含兩個容器,分別通過
subPath掛載同一個PVC (bmcpfs) 的不同子目錄。當Pod掛載時,如果
subPath指定的子目錄(例如workspace/alpha)在CPFS檔案系統中不存在,系統將自動建立。apiVersion: v1 kind: Pod metadata: name: cpfs-subpath-demo-pod spec: containers: - name: task-alpha-container image: busybox:1.35 command: ["/bin/sh", "-c", "sleep 3600"] volumeMounts: - name: cpfs-storage mountPath: /data/workspace # 容器內的掛載路徑 subPath: workspace/alpha # 指定掛載卷內的 workspace/alpha 子目錄,而非整個卷 - name: task-beta-container image: busybox:1.35 command: ["/bin/sh", "-c", "sleep 3600"] volumeMounts: - name: cpfs-storage mountPath: /data/workspace # 容器內的掛載路徑可以相同 subPath: workspace/beta # 指定掛載卷內的 workspace/beta 子目錄,而非整個卷 volumes: - name: cpfs-storage persistentVolumeClaim: claimName: bmcpfs # 引用此前建立的PVC部署Pod。
kubectl apply -f pod.yaml驗證 task-alpha 容器的掛載和寫入。
串連到task-alpha容器。
kubectl exec -it cpfs-subpath-demo-pod -c task-alpha-container -- /bin/sh查看已掛載的檔案系統,確認 CPFS 儲存卷是否存在。
df -h預期輸出如下,表明共用目錄(/share)已被成功掛載到容器內的 /data/workspace 路徑下。
Filesystem Size Used Available Use% Mounted on ... 192.XX.XX.0:/share 10.0T 1.0G 10.0T 0% /data/workspace ...檢查掛載點的父目錄結構。
ls -l /data/預期輸出如下,表明/data 目錄下存在名為 workspace 的子目錄。
total 4 drwxr-xr-x 2 root root 4096 Aug 15 10:00 workspace在掛載目錄中建立檔案以驗證寫入許可權。
echo "hello from alpha" > /data/workspace/alpha.log exit
驗證 task-beta 容器的掛載和資料隔離。
串連到
task-beta容器。kubectl exec -it cpfs-subpath-demo-pod -c task-beta-container -- /bin/sh在容器的掛載點 /data/workspace 中建立檔案。
echo "hello from beta" > /data/workspace/beta.log檢查/data/workspace/目錄下的檔案。
ls -l /data/workspace/預期輸出如下,表明beta.log寫入成功,且不存在alpha.log,兩個容器間的資料相互隔離。
total 4 -rw-r--r-- 1 root root 16 Aug 15 10:05 beta.log
步驟三:驗證掛載
kubectl exec -it <pod-name> -- mount | grep /data
# 期望輸出包含 fuse.aliyun-alinas-efc,表明使用 EFC + FUSE 協議