CPFS是一種高吞吐、高IOPS的並行檔案系統,適用於AI訓練、自動駕駛等Alibaba Cloud HPC情境。在ACK叢集中,多個Pod可以掛載同一個CPFS通用版靜態儲存卷,以實現高效能的資料共用和持久化儲存。
工作原理
在ACK叢集中掛載CPFS通用版靜態儲存卷主要流程如下。
建立PV:在叢集中“註冊”已有的CPFS通用版,聲明其掛載地址、容量、訪問模式等。
建立PVC:應用通過PVC來“申請”使用登入的儲存資源。PVC會與合格PV自動綁定。
在應用中掛載:將已綁定的PVC掛載到應用Pod中,作為容器內的一個持久化目錄。
準備工作
檢查並升級CSI組件:已確保csi-plugin和csi-provisioner組件版本不低於v1.22.11-abbb810e-aliyun。
如需升級,請參見升級CSI組件。
已配置儲存群組件,以支援CPFS的掛載。
已準備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檔案系統。
將以下內容儲存為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核心參數說明:
參數
說明
accessModesPV的訪問模式。
capacity.storage聲明儲存卷容量。
csi.driver驅動類型,使用CPFS通用版時固定為
nasplugin.csi.alibabacloud.com。csi.volumeAttributes.serverCPFS通用版協議服務匯出目錄的掛載地址中的掛載點網域名稱。
csi.volumeAttributes.pathCPFS通用版協議服務匯出目錄的掛載地址中的掛載目錄,例如
/share。支援設定為子目錄,例如/share/dir。csi.volumeAttributes.mountProtocolcpfs-nfs表示使用NFS協議掛載CPFS。csi.volumeAttributes.volumeAssubpath表示建立子目錄類型的PV。csi.volumeHandle與PV Name保持一致。
執行以下命令建立PV。
kubectl apply -f cpfs-pv.yaml查看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,用於“申請”使用上一步註冊的儲存資源。
將以下內容儲存為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參數
說明
accessModesPVC請求PV的訪問模式。
selector使用PV上的Label進行匹配綁定。
resources.requests.storage分配給Pod的儲存容量。不大於PV容量即可。
建立PVC。
kubectl apply -f cpfs-pvc.yaml查看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。
將以下內容儲存為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建立StatefulSet。
kubectl apply -f cpfs-test.yaml查看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檢查容器內的掛載點,確認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中查看,驗證資料的共用儲存。
查看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在一個Pod中建立檔案。
以名為
cpfs-sts-0的Pod作為樣本:kubectl exec cpfs-sts-0 -- touch /data/test.txt在另一個Pod中查看檔案是否存在。
以名為
cpfs-sts-1的Pod為例。kubectl exec cpfs-sts-1 -- ls /data預期輸出:
test.txt可以查看到此前建立的檔案,表明資料可在多Pod間共用。
持久化儲存
重建Deployment,在建立Pod中查看檔案系統中的資料是否存在,驗證資料的持久化儲存。
刪除應用Pod以觸發重建。
kubectl rollout restart sts cpfs-sts查看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在新Pod中查看此前建立的檔案是否存在。
以名為
cpfs-sts-0的Pod為例。kubectl exec cpfs-sts-0 -- ls /data預期輸出:
test.txt可以查看到此前寫入的檔案,表明資料可持久化儲存。
生產環境使用建議
效能調優:CPFS適用於高吞吐和高IOPS情境。可在PV的
mountOptions中調整NFS掛載參數(如rsize、wsize)以最佳化效能,滿足特定工作負載需求。資料一致性:CPFS作為共用儲存,不保證多個Pod並發寫入同一檔案的資料一致性。為避免檔案損壞,需在應用程式層面自行實現分布式鎖或採用僅追加(Append-only)的寫入模式。
儲存卷管理:靜態儲存卷的方式需手動管理PV。對於需要為多個應用自動建立、隔離儲存卷的情境,推薦使用CNFS管理CPFS動態儲存裝置卷,請參見管理CPFS通用版動態儲存裝置卷。