容器服務 Kubernetes 版支持以NAS隔離存儲卷的方式掛載和使用CNFS。在多租戶環境或其他需要數據隔離的場景中,您可以通過CNFS管理NAS隔離存儲卷,在多個應用或Pod之間掛載同一個NAS文件系統的不同目錄,使得每個目錄均對應一個存儲卷,存儲卷之間是相互獨立的、相互隔離的。本文以StatefulSet類型應用為例介紹如何使用CNFS管理NAS隔離存儲卷。
前提條件
已開通文件存儲NAS服務。
首次登錄文件存儲NAS產品詳情頁時,按照頁面引導開通服務。
已創建Kubernetes集群,Kubernetes版本為v1.20及以上,且存儲插件選擇為CSI。具體操作,請參見創建Kubernetes托管版集群。
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工具連接集群。
說明關于什么是容器網絡文件系統CNFS,請參見容器網絡文件系統CNFS概述。
關于如何使用CNFS托管NAS文件系統,請參見通過CNFS方式使用NAS文件系統。
步驟一:創建隔離存儲卷的工作負載
創建名稱為
cnfs-nas-sc
的StorageClass對象,PV對象中引用名稱為cnfs-nas-filesystem
的CNFS。創建名稱為
cnfs-nas-dynamic-sts
的StatefulSet對象。StatefulSet對象使用volumeClaimTemplates創建一個名稱為
pvc-cnfs-nas-dynamic-sts-0
的PVC對象。StatefulSet對象中使用busybox鏡像掛載PVC,并將1 G的臨時數據
1G.tmpfile
寫入掛載點中。
cat << EOF | kubectl apply -f -
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: cnfs-nas-sc
mountOptions:
- nolock,tcp,noresvport
- vers=3
parameters:
volumeAs: subpath
containerNetworkFileSystem: cnfs-nas-filesystem # 引用名稱為cnfs-nas-filesystem的CNFS對象。
path: "/"
archiveOnDelete: "false"
provisioner: nasplugin.csi.alibabacloud.com
reclaimPolicy: Delete
allowVolumeExpansion: true
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: cnfs-nas-dynamic-sts
labels:
app: busybox
spec:
serviceName: "busybox"
replicas: 2
selector:
matchLabels:
app: busybox
template:
metadata:
labels:
app: busybox
spec:
containers:
- name: busybox
image: busybox
command: ["/bin/sh"]
args: ["-c", "sleep 3600;"]
volumeMounts:
- mountPath: "/data"
name: pvc
volumeClaimTemplates:
- metadata:
name: pvc
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "cnfs-nas-sc" # 引用名稱為cnfs-nas-sc的StorageClass對象。
resources:
requests:
storage: 50Gi
EOF
步驟二:查看掛載情況
執行如下命令,查看掛載情況。
kubectl exec cnfs-nas-dynamic-sts-0 -- mount |grep nfs
預期輸出:
971134b0e8-****.cn-zhangjiakou.nas.aliyuncs.com:/nas-95115c94-2ceb-4a83-b4f4-37bd35df**** on /data type nfs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,default_permissions,allow_other)
預期輸出表明,掛載成功。
步驟三:查看持久化數據是否寫入成功
執行以下命令,寫入1 G的臨時文件。
kubectl exec cnfs-nas-dynamic-sts-0 -ti -- sh -c 'dd if=/dev/zero of=/data/1G.tmpfile bs=1G count=1;'
執行如下命令,查看1 G的臨時文件是否寫入成功。
kubectl exec cnfs-nas-dynamic-sts-0 -- ls -arlth /data
預期輸出:
total 1G
-rw-r--r-- 1 root root 1.0G Dec 15 12:11 1G.tmpfile
預期輸出表明,在/data下已經成功寫入1 G的臨時文件1G.tmpfile
。
步驟四:查看寫入的數據是否在其他Pod中隔離
執行以下命令,查看1 G的臨時文件是否在Pod cnfs-nas-dynamic-sts-1中隔離。
kubectl exec cnfs-nas-dynamic-sts-1 -- ls -arlth /data
預期輸出:
sh-4.4# ls -arlth
total 8.0K
drwxr-xr-x 1 root root 4.0K Dec 15 18:07 ..
drwxr-xr-x 2 root root 4.0K Dec 15 18:07 .
預期輸出表明,在Pod cnfs-nas-dynamic-sts-0中寫入了1 G的臨時文件1G.tmpfile
,在Pod cnfs-nas-dynamic-sts-1中相互隔離。
相關文檔
如果您需要在多個應用或Pod之間掛載同一個NAS文件系統的相同目錄,多個Pod之間可以共享數據,請參見使用CNFS管理NAS共享存儲卷(推薦)。
如果您需要實現NAS存儲卷的使用率高于某個閾值時觸發自動擴容,請參見使用CNFS自動擴容NAS存儲卷。