為提升CPFS文件系統的性能,容器服務ACK支持使用CNFS(Container Network File System)托管CPFS文件系統,對文件系統層獨立管理。本文介紹如何通過CNFS的隔離存儲卷方式,掛載NFS和EFC客戶端使用CPFS文件系統。
索引
前提條件
已創建Kubernetes集群,Kubernetes版本為v1.20及以上,且存儲插件選擇為CSI。具體操作,請參見創建ACK托管集群。
已確保CSI-Plugin和CSI-Provisioner組件版本為v1.24.11-5221f79-aliyun及以上。關于升級CSI-Plugin和CSI-Provisioner組件的操作,請參見管理CSI組件。
已確保storage-operator組件版本為v1.24.105-825188d-aliyun及以上。關于升級storage-operator組件的操作,請參見管理組件。
已通過kubectl工具連接Kubernetes集群。具體操作,請參見獲取集群KubeConfig并通過kubectl工具連接集群。
已創建CPFS文件系統和對應的協議服務,并獲取掛載點地址。具體操作,請參見創建文件系統和創建協議服務并獲取掛載地址。
重要創建的CPFS文件系統和集群必須在同一VPC下。
CPFS的協議服務掛載點和集群建議在同一交換機下,以提升使用性能。
步驟一:安裝客戶端依賴并重啟CSI-Plugin組件
執行以下命令,查看集群中是否存在名為csi-plugin的ConfigMap。
kubectl get configmap csi-plugin -nkube-system
預期輸出:
NAME DATA AGE csi-plugin X 6d22h
執行以下命令,對名稱為csi-plugin的ConfigMap進行更新操作。
kubectl edit configmap csi-plugin -nkube-system
執行以下命令,在ConfigMap文件中新增
cnfs-client-properties
字段,并安裝客戶端依賴。cat <<EOF | kubectl apply -f - apiVersion: v1 kind: ConfigMap metadata: name: csi-plugin namespace: kube-system data: cnfs-client-properties: | cpfs-efc=true # csi-plugin啟動時會安裝相關依賴。 EOF
執行以下命令,重啟CSI-Plugin組件。
kubectl -n kube-system rollout restart daemonset csi-plugin
步驟二:使用NFS和EFC客戶端掛載CPFS文件系統
使用NFS客戶端掛載CPFS文件系統
使用以下YAML文件,創建一個CNFS托管CPFS文件系統,通過CNFS的隔離卷方式使用NFS客戶端掛載CPFS文件系統,同時將隔離存儲卷綁定到工作負載StatefulSet中。
# 創建CNFS、StorageClass和StatefulSet對象。 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" provisioner: nasplugin.csi.alibabacloud.com reclaimPolicy: Delete allowVolumeExpansion: true --- apiVersion: apps/v1 kind: StatefulSet metadata: name: cnfs-nfs-cpfs-sts spec: selector: matchLabels: app: busybox serviceName: "busybox" replicas: 2 template: metadata: labels: app: busybox spec: containers: - name: busybox image: busybox command: ["/bin/sh"] args: ["-c", "sleep 3600;"] volumeMounts: - name: pvc mountPath: /data volumeClaimTemplates: - metadata: name: pvc spec: accessModes: [ "ReadWriteOnce" ] storageClassName: "cnfs-nfs-cpfs-sc" resources: requests: storage: 50Gi EOF
執行以下命令,查看CNFS是否為可用狀態。
kubectl get cnfs cnfs-nfs-cpfs -oyaml | grep status
預期輸出:
status: status: Ready status: Available
預期輸出表明,CNFS狀態為
Available
可用狀態。執行以下命令,查看PVC是否為綁定狀態。
kubectl get pvc -owide | grep cnfs-nfs-cpfs-sc
預期輸出:
pvc-cnfs-nfs-cpfs-sts-0 Bound nas-38727f0c-58c7-40df-b2e2-80537fcd74ae 50Gi RWO cnfs-nfs-cpfs-sc 66s Filesystem pvc-cnfs-nfs-cpfs-sts-1 Bound nas-ead04f09-ca37-408c-a50d-17e609fd48cf 50Gi RWO cnfs-nfs-cpfs-sc 4m50s Filesystem
預期輸出表明,PVC狀態為
Bound
綁定狀態。執行以下命令,查看Pod是否為運行狀態。
kubectl get sts cnfs-nfs-cpfs-sts -owide
預期輸出:
NAME READY AGE CONTAINERS IMAGES cnfs-nfs-cpfs-sts 2/2 98s busybox busybox
執行以下命令,查看其中一個Pod是否掛載成功。
kubectl exec cnfs-nfs-cpfs-sts-0 -- mount | grep nfs
預期輸出:
cpfs-03129888b1d5c6e7-031b038b4345e7cen.cn-beijing.cpfs.aliyuncs.com:/share/nas-e223798f-dccc-4453-be19-72140884f642 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)
預期輸出表明,CNFS使用NFS客戶端已成功掛載CPFS文件系統。
使用EFC客戶端掛載CPFS文件系統
使用以下YAML文件,創建一個CNFS托管CPFS文件系統,通過CNFS的隔離卷方式使用EFC客戶端掛載CPFS文件系統,同時將隔離存儲卷綁定到工作負載StatefulSet中。
# 創建CNFS、StorageClass和StatefulSet對象。 cat << EOF | kubectl apply -f - apiVersion: storage.alibabacloud.com/v1beta1 kind: ContainerNetworkFileSystem metadata: name: cnfs-efc-cpfs spec: type: cpfs reclaimPolicy: Retain parameters: protocolServer: cpfs-xxxx.xxxx.cpfs.aliyuncs.com # 填寫CPFS的協議服務的掛載點域名。 useClient: EFCClient # 使用EFC客戶端進行掛載。 --- apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: cnfs-efc-cpfs-sc mountOptions: - nolock,tcp,noresvport - vers=3 parameters: volumeAs: subpath containerNetworkFileSystem: "cnfs-efc-cpfs" # 引用創建的CNFS對象cnfs-efc-cpfs。 path: "/share" provisioner: nasplugin.csi.alibabacloud.com reclaimPolicy: Delete allowVolumeExpansion: true --- apiVersion: apps/v1 kind: StatefulSet metadata: name: cnfs-efc-cpfs-sts spec: selector: matchLabels: app: busybox serviceName: "busybox" replicas: 2 template: metadata: labels: app: busybox spec: containers: - name: busybox image: busybox command: ["/bin/sh"] args: ["-c", "sleep 3600;"] volumeMounts: - name: pvc mountPath: /data volumeClaimTemplates: - metadata: name: pvc spec: accessModes: [ "ReadWriteOnce" ] storageClassName: "cnfs-efc-cpfs-sc" resources: requests: storage: 50Gi EOF
執行以下命令,查看CNFS是否為可用狀態。
kubectl get cnfs cnfs-efc-cpfs -oyaml | grep status
預期輸出:
status: status: Ready status: Available
預期輸出表明,CNFS狀態為
Available
可用狀態。執行以下命令,查看PVC是否為綁定狀態。
kubectl get pvc -owide | grep cnfs-efc-cpfs-sc
預期輸出:
pvc-cnfs-efc-cpfs-sts-0 Bound nas-38727f0c-58c7-40df-b2e2-80537fcd74ae 50Gi RWO cnfs-efc-cpfs-sc 66s Filesystem pvc-cnfs-efc-cpfs-sts-1 Bound nas-ead04f09-ca37-408c-a50d-17e609fd48cf 50Gi RWO cnfs-efc-cpfs-sc 4m50s Filesystem
預期輸出表明,PVC狀態為
Bound
綁定狀態。執行以下命令,查看Pod是否為運行狀態。
kubectl get sts cnfs-efc-cpfs-sts -owide
預期輸出:
NAME READY AGE CONTAINERS IMAGES cnfs-efc-cpfs-sts 2/2 198s busybox busybox
執行以下命令,查看其中一個Pod是否掛載成功。
kubectl exec cnfs-efc-cpfs-sts-0 -- mount | grep efc
預期輸出:
bindroot-90f07-x6ducKqW:cpfs-03129888b1d5c6e7-031b038b4345e7cen.cn-beijing.cpfs.aliyuncs.com:/share/nas-e502f35f-2d42-4292-bf2c-c39885c38820 on /data type alifuse.aliyun-alinas-efc (rw,nosuid,nodev,relatime,user_id=0,group_id=0,default_permissions,allow_other)
預期輸出表明,CNFS使用EFC客戶端已成功掛載CPFS文件系統。
步驟三:查看持久化數據是否寫入成功
執行以下命令,將1G的臨時文件寫入其中一個名稱為
cnfs-xxx-cpfs-sts-0
的Pod中,并查看是否寫入成功。kubectl exec cnfs-xxx-cpfs-sts-0 -- sh -c "dd if=/dev/zero of=/data/1G.tmpfile bs=1G count=1;ls -alrth /data"
預期輸出:
total 1G drwxr-xr-x 2 root root 4.0K Apr 19 12:42 . drwxr-xr-x 1 root root 4.0K Apr 19 12:42 .. -rw-r--r-- 1 root root 1.0G Apr 19 12:50 1G.tmpfile 1+0 records in 1+0 records out 1073741824 bytes (1.0GB) copied, 2.729605 seconds, 375.1MB/s
執行以下命令,在名稱為
cnfs-xxx-cpfs-sts-1
的Pod中,確認并不存在該臨時文件。kubectl exec cnfs-xxx-cpfs-sts-1 -- sh -c "ls -alrth /data"
預期輸出:
total 5K drwxr-xr-x 2 root root 4.0K Apr 19 12:42 . drwxr-xr-x 1 root root 4.0K Apr 19 12:42 ..
預期輸出表明,名稱為
cnfs-xxx-cpfs-sts-0
的Pod與名稱為cnfs-xxx-cpfs-sts-1
的Pod中,所使用的存儲卷相互隔離。