在ACK中,通過CNFS可將一個共用的CPFS通用版檔案系統,以動態儲存裝置卷的方式為應用提供儲存。配置StorageClass後,工作負載可自動獲得基於CPFS隔離子目錄的獨立PV,從而實現資料隔離,並簡化儲存管理。
前提條件
根據叢集版本,完成以下條件。
如需升級叢集,請參見升級叢集。
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的協議服務掛載點和叢集處於同一交換器下,以提升使用效能。
步驟一:使用NFS用戶端掛載CPFS檔案系統
參考以下內容,建立一個CNFS託管CPFS檔案系統。
以下命令將建立一個CNFS和一個StorageClass,通過CNFS隔離卷方式使用NFS用戶端掛載CPFS檔案系統。
cat << EOF | kubectl apply -f - apiVersion: storage.alibabacloud.com/v1beta1 kind: ContainerNetworkFileSystem metadata: name: cnfs-nfs-cpfs spec: type: cpfs reclaimPolicy: Retain parameters: protocolServer: cpfs-xxxx.xxxx.cpfs.aliyuncs.com # 填寫CPFS的協議服務的掛載點網域名稱。 useClient: NFSClient # 使用NFS用戶端進行掛載。 --- apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: cnfs-nfs-cpfs-sc mountOptions: - nolock,tcp,noresvport - vers=3 parameters: volumeAs: subpath containerNetworkFileSystem: "cnfs-nfs-cpfs" # 引用建立的CNFS對象cnfs-nfs-cpfs。 path: "/share" archiveOnDelete: "true" provisioner: nasplugin.csi.alibabacloud.com reclaimPolicy: Retain allowVolumeExpansion: true EOFCNFS
參數
說明
type需要建立的儲存卷類型。本樣本為
cpfs。reclaimPolicy回收策略。僅支援
Retain,刪除CNFS時並不會刪除CPFS檔案系統。parametersprotocolServer填寫CPFS通用版檔案系統的協議服務的掛載點網域名稱。
useClient配置為
NFSClient,表示使用NFS用戶端進行掛載。StorageClass
參數
說明
mountOptions掛載參數。預設參考本文樣本即可。
parametersvolumeAs設定為
subpath,表示建立子目錄類型的PV。containerNetworkFileSystem關聯的CNFS的名稱。
pathCPFS通用版協議服務匯出目錄對應路徑,例如
/share。支援設定為子目錄,例如/share/dir。目前僅支援普通目錄,不支援Fileset。
parameters.archiveOnDelete刪除PVC時,若
reclaimPolicy為Delete,後端儲存的檔案資料是否被真正刪除。CPFS通用版為共用儲存,提供此選項進行雙重確認。
true(預設):不會真正刪除目錄或檔案,而是將其歸檔並重新命名,格式為archived-{pvName}.{timestamp}。false:後端對應的目錄及資料會被真正刪除。此處刪除的是CPFS的subpath目錄以及其中檔案,CPFS本身不會被刪除。
如需刪除CPFS,請參見刪除檔案系統。
reclaimPolicyPV的回收策略。
Delete:刪除PVC時,根據archiveOnDelete的配置處理後端儲存資料。Retain:刪除PVC時,PV和CPFS不會被刪除,需手動刪除。適用於對資料安全性要求高的情境,以免誤刪資料。
allowVolumeExpansion選擇性參數。表示允許擴容CPFS儲存卷。
參考以下內容,建立一個名為
cnfs-nfs-cpfs-sts的StatefulSet並掛載CPFS隔離儲存卷。cat << EOF | kubectl apply -f - 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 mountPath: /data volumeClaimTemplates: - metadata: name: pvc spec: accessModes: [ "ReadWriteOnce" ] storageClassName: "cnfs-nfs-cpfs-sc" # 綁定的StorageClass名稱。 resources: requests: storage: 50Gi EOF查看CNFS狀態。
kubectl get cnfs cnfs-nfs-cpfs -o jsonpath='{.status.status}'預期返回如下,狀態為
Available表示CNFS可用。Available查看PVC狀態。
kubectl get pvc -o wide | grep cnfs-nfs-cpfs-sc預期返回如下,已自動建立2個PVC,並綁定了自動建立的PV。
pvc-cnfs-nfs-cpfs-sts-0 Bound nas-804e8cb1-2355-4026-87fc-ee061e14f5f9 50Gi RWO cnfs-nfs-cpfs-sc <unset> 5m36s Filesystem pvc-cnfs-nfs-cpfs-sts-1 Bound nas-00baf7ff-75dc-440d-bab1-ea8872f1adea 50Gi RWO cnfs-nfs-cpfs-sc <unset> 5m25s Filesystem查看Pod狀態。
kubectl get pod | grep cnfs-nfs-cpfs-sts預期返回:
NAME READY STATUS RESTARTS AGE cnfs-nfs-cpfs-sts-0 1/1 Running 0 9m22s cnfs-nfs-cpfs-sts-1 1/1 Running 0 9m11s確認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.0.1.255,mountvers=3,mountport=30000,mountproto=tcp,local_lock=all,addr=127.0.1.255)
步驟二:驗證儲存卷是否相互隔離
將1G的臨時檔案寫入其中一個名稱為
cnfs-xxx-cpfs-sts-0的Pod中,並查看是否寫入成功。請使用實際Pod名稱替換
cnfs-xxx-cpfs-sts-0。kubectl exec cnfs-xxx-cpfs-sts-0 -- sh -c "dd if=/dev/zero of=/data/1G.tmpfile bs=1G count=1;ls -alrth /data"預期返回:
1+0 records in 1+0 records out 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 2.2487 s, 477 MB/s total 1.1G drwxr-xr-x 1 root root 4.0K Aug 5 08:46 .. drwxr-xr-x 2 root root 4.0K Aug 5 09:10 . -rw-r--r-- 1 root root 1.0G Aug 5 09:10 1G.tmpfile在名稱為
cnfs-xxx-cpfs-sts-1的Pod中,確認並不存在1G的臨時檔案。請使用實際Pod名稱替換
cnfs-xxx-cpfs-sts-1。kubectl exec cnfs-xxx-cpfs-sts-1 -- sh -c "ls -alrth /data"預期返回如下,在名稱為
cnfs-xxx-cpfs-sts-1的Pod中並不存在1G的臨時檔案,即StatefulSet中的2個Pod所使用的儲存卷相互隔離。total 4.5K drwxr-xr-x 2 root root 4.0K Aug 5 08:46 . drwxr-xr-x 1 root root 4.0K Aug 5 08:46 ..