ACK 可通過 CNFS 將 CPFS 通用版檔案系統掛載為動態儲存裝置卷。配置 StorageClass 後,每個工作負載可自動獲得獨立的 PV,資料隔離,無需手動管理儲存。
流程指引
使用動態儲存裝置卷時,應用建立 PVC 後,系統會根據指定的 StorageClass 自動建立儲存卷和對應的 PV。無需預先分配,支援自動擴容。
在叢集中掛載 CPFS 動態儲存裝置卷的主要流程如下。
|
準備工作
根據叢集版本,確認相關組件符合條件。
如需升級叢集,請參見升級叢集。
1.26及以上
確保CSI組件版本為v1.32.2-757e24b-aliyun及以上。
如需升級CSI組件,請參見管理CSI組件。
已安裝cnfs-nas-daemon組件,並在csi-plugin組件的FeatureGate中增加
AlinasMountProxy=true以啟用cnfs-nas-daemon,請參見管理cnfs-nas-daemon組件。
1.26以下
確保CSI組件版本為v1.24.11-5221f79-aliyun及以上。
如需升級CSI組件,請參見管理CSI組件。
已安裝用戶端依賴並重啟csi-plugin組件。
已建立與叢集處於同一VPC下的CPFS通用版檔案系統和對應的協議服務,並擷取掛載點地址,詳見建立協議服務並擷取掛載地址。
建議CPFS的協議服務掛載點和叢集處於同一交換器下,以提升使用效能。
使用限制
僅支援部分地區,請參見CPFS通用版開服地區。
僅支援通過NFS協議掛載,不支援通過POSIX協議掛載。
僅支援掛載到x86架構的節點上。
不支援跨VPC掛載,僅支援掛載到同一VPC的叢集中。
不支援掛載到作業系統為ContainerOS的節點上。
步驟一:建立CNFS
建立CNFS對象,在叢集中“註冊”已有的CPFS檔案系統。
參見代碼,建立
cnfs.yaml。apiVersion: storage.alibabacloud.com/v1beta1 kind: ContainerNetworkFileSystem metadata: name: cnfs-nfs-cpfs spec: # 指定後端儲存類型為 CPFS type: cpfs # 刪除此 CNFS 時,後端的 CPFS 檔案系統不會被刪除 reclaimPolicy: Retain parameters: # CPFS 的協議服務的掛載點網域名稱 protocolServer: cpfs-xxxx.xxxx.cpfs.aliyuncs.com # 使用 NFS 用戶端進行掛載 useClient: NFSClient參數說明:
參數
說明
spec.type後端儲存類型,此處固定為
cpfs。spec.reclaimPolicy回收策略。僅支援
Retain,刪除CNFS時,CPFS檔案系統不會被刪除。spec.parameters.protocolServerCPFS通用版協議服務匯出目錄的掛載地址中的掛載點網域名稱。
spec.parameters.useClient配置為
NFSClient,使用NFS用戶端進行掛載。建立CNFS。
kubectl apply -f cnfs.yaml查看CNFS狀態,確認為
Available。kubectl get cnfs cnfs-nfs-cpfs -o jsonpath='{.status.status}'
步驟二:建立StorageClass
建立StorageClass,作為動態供應的模板,並引用此前建立的CNFS。
參見代碼,建立
sc.yaml。apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: cnfs-nfs-cpfs-sc # 掛載參數 mountOptions: - nolock,tcp,noresvport - vers=3 parameters: # 建立子目錄類型的 PV volumeAs: subpath # 引用此前建立的 CNFS containerNetworkFileSystem: "cnfs-nfs-cpfs" # CPFS 通用版協議服務匯出目錄對應路徑 path: "/share" # 刪除 PVC 時的資料處理策略,true 表示歸檔而非直接刪除 archiveOnDelete: "true" provisioner: nasplugin.csi.alibabacloud.com # PV 回收策略,僅支援 Retain reclaimPolicy: Retain # 允許儲存卷擴容 allowVolumeExpansion: true參數說明:
參數
說明
mountOptions掛載參數。預設參考本文樣本即可。
parameters.volumeAssubpath:子目錄模式。一個PV對應一個CPFS檔案系統的獨立子目錄,便於資料隔離。sharepath:共用目錄模式。所有PV均對應StorageClass中定義的同一個CPFS目錄,所有使用此StorageClass的PVC都指向CPFS上同一個共用目錄。
parameters.containerNetworkFileSystem待引用的CNFS。
parameters.pathCPFS通用版協議服務匯出目錄對應路徑,如
/share。支援設定為子目錄,如/share/dir。目前僅支援普通目錄,不支援Fileset。
parameters.archiveOnDelete僅在
volumeAs為subpath且reclaimPolicy為Delete時生效。CPFS通用版為共用儲存,提供此選項進行雙重確認。
控制刪除PVC後子目錄資料的處理方式。
true(預設):子目錄不會被刪除,而是歸檔並重新命名,格式為archived-{pvName}.{timestamp},資料可手動恢複。false:子目錄及其中的檔案會被直接刪除,不可恢複。此處刪除的是CPFS的subpath子目錄及其檔案,CPFS檔案系統本身不會被刪除。如需刪除CPFS,請參見刪除檔案系統。
reclaimPolicycsi-provisioner為託管版時,版本需為v1.34.1及以上;非託管版無版本限制。
僅在
volumeAs為subpath時生效。PV的回收策略,控制刪除PVC後的資源處理方式。
Delete:刪除PVC時,自動釋放PV。後端子目錄資料是否真正刪除,由archiveOnDelete參數進一步控制。Retain:刪除PVC時,PV保留,後端資料不受影響,需手動清理。適用於對資料安全性要求高的情境。
allowVolumeExpansion啟用後,CPFS儲存卷可自動擴容。
建立StorageClass。
kubectl apply -f sc.yaml查看StorageClass是否建立成功。
kubectl get sc cnfs-nfs-cpfs-sc預期輸出:
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE cnfs-nfs-cpfs-sc nasplugin.csi.alibabacloud.com Retain Immediate true 9s
步驟三:建立應用並掛載
建立工作負載,並在其volumeClaimTemplates中聲明使用上一步建立的StorageClass。
參見代碼,建立
sts.yaml。apiVersion: apps/v1 kind: StatefulSet metadata: name: cnfs-nfs-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: pvc # 將儲存卷掛載到容器內的 /data 目錄 mountPath: /data # 定義 PVC 模板,StatefulSet Controller 會為每個 Pod 動態建立一個PVC volumeClaimTemplates: - metadata: name: pvc spec: accessModes: [ "ReadWriteOnce" ] # 引用此前建立的 StorageClass storageClassName: "cnfs-nfs-cpfs-sc" resources: requests: storage: 50Gi建立應用。
kubectl apply -f sts.yaml查看Pod是否進入Running狀態。
kubectl get pod | grep cnfs-nfs-cpfs-sts預期返回:
cnfs-nfs-cpfs-sts-0 1/1 Running 0 11s cnfs-nfs-cpfs-sts-1 1/1 Running 0 9s確認Pod已掛載CPFS儲存卷。
kubectl exec cnfs-nfs-cpfs-sts-0 -- mount | grep nfs預期輸出如下,表明CNFS使用NFS用戶端已成功掛載CPFS檔案系統。
cpfs-********-********.cn-shanghai.cpfs.aliyuncs.com:/share/nas-804e8cb1-2355-4026-87fc-ee061e14f5f9 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.XX.XX.255,mountvers=3,mountport=30000,mountproto=tcp,local_lock=all,addr=127.XX.XX.255)
步驟四:結果驗證
應用建立後,系統會自動完成儲存的供應和掛載。
驗證自動供應
查看PVC狀態,確認已自動建立了兩個PVC,並綁定到動態產生的PV。
kubectl get pvc -l app=nginx預期輸出:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
pvc-cnfs-nfs-cpfs-sts-0 Bound nas-8d2530eb-fcf9-4ad5-b5f8-bae02a1***** 50Gi RWO cnfs-nfs-cpfs-sc <unset> 63s
pvc-cnfs-nfs-cpfs-sts-1 Bound nas-e84cadaf-ce35-4745-8cbb-2a80026***** 50Gi RWO cnfs-nfs-cpfs-sc <unset> 61s驗證Pod運行與掛載
檢查容器內的掛載點,確認CPFS隔離子目錄已掛載成功。
kubectl exec cnfs-nfs-cpfs-sts-0 -- mount | grep /data預期輸出中掛載路徑包含了自動產生的PV名(例如nas-804e8cb1-xxxx),表明掛載的是隔離子目錄。
cpfs-....aliyuncs.com:/share/nas-804e8cb1-2355-4026-87fc-ee061e1****** on /data type nfs (rw,...)驗證儲存卷隔離
驗證為不同Pod動態建立的儲存卷是相互隔離的。
在
cnfs-nfs-cpfs-sts-0中建立一個臨時檔案。kubectl exec cnfs-nfs-cpfs-sts-0 -- touch /data/test.txt在
cnfs-nfs-cpfs-sts-1中查看/data目錄,確認不存在該測試檔案。kubectl exec cnfs-nfs-cpfs-sts-1 -- ls /data預期輸出不存在該檔案,表明動態建立的儲存卷是相互隔離的,資料並未共用。
應用於生產環境
效能調優:CPFS適用於高吞吐和高IOPS情境。可在PV的
mountOptions中調整NFS掛載參數(如rsize、wsize)以最佳化效能,滿足特定工作負載需求。資料保護:建議在StorageClass中將
reclaimPolicy設定為Retain,並將archiveOnDelete設定為true,以防止因誤刪PVC導致後端資料丟失。
資源釋放指引
為避免產生預期外費用並確保資料安全,請遵循以下流程釋放無需使用的資源。
刪除工作負載
操作:刪除所有使用相關PVC的應用,例如StatefulSet。此操作將停止啟動並執行Pod並卸載儲存卷。
命令樣本:
kubectl delete statefulset <your-statefulset-name>
刪除PVC
操作:刪除應用關聯的PVC。後端資料的處理方式由
volumeAs、reclaimPolicy和archiveOnDelete共同決定。volumeAs: subpath每個PVC對應獨立子目錄,刪除行為如下:
reclaimPolicy: Retain:PV保留,CPFS子目錄資料不變,需手動清理。reclaimPolicy: Delete+archiveOnDelete: "true":PV自動釋放。子目錄歸檔重新命名為archived-{pvName}.{timestamp},資料不丟失。reclaimPolicy: Delete+archiveOnDelete: "false":PV自動釋放。子目錄及檔案直接刪除,不可恢複。請謹慎操作。
volumeAs: sharepath多個PVC共用同一目錄。刪除PVC不會影響後端目錄及資料,
reclaimPolicy和archiveOnDelete均不生效。
無論以上哪種配置,CPFS檔案系統本身均不會被刪除。如需刪除CPFS,請參見刪除檔案系統。
命令樣本:
kubectl delete pvc <your-pvc-name>
刪除Kubernetes儲存資源定義
此操作僅移除叢集內的資源定義,不會刪除後端的CPFS檔案系統。
刪除PV
操作:若
reclaimPolicy為Retain,刪除PVC後PV狀態變為Released,如確認資料無需保留,可手動刪除PV。命令樣本:
kubectl delete pv <your-pv-name>
刪除StorageClass
操作:如不再需要該類型的儲存,可刪除對應的StorageClass。
命令樣本:
kubectl delete sc <your-storageclass-name>
刪除CNFS
操作:如不再需要在叢集中使用該CPFS檔案系統,可刪除CNFS對象。刪除CNFS不會刪除後端CPFS檔案系統。
命令樣本:
kubectl delete cnfs <your-cnfs-name>