容器服务 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存储卷。