NAS存储卷适用于大数据分析、共享数据、Web应用以及保存日志等场景。除使用静态存储卷外,您也可以创建PVC并配置StorageClass来实现存储资源的动态分配,让系统为您自动预留持久化存储卷,无需预先手动创建和配置存储资源。您可以通过subpath方式、sharepath方式以及filesystem方式挂载NAS动态存储卷。
前提条件
集群默认已安装CSI组件。如需升级请参见升级csi-plugin和csi-provisioner。
说明如果您集群中使用Flexvolume组件,由于Flexvolume已废弃,请参见迁移Flexvolume至CSI完成迁移后再进行挂载。您可以在 ,在存储页签下确认存储组件类型。
已通过kubectl连接集群。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群。
使用限制
不支持挂载SMB协议的NAS文件系统。
通用NAS与极速NAS在挂载连通性、文件系统数量及协议类型等方面存在相应约束条件。更多信息,请参见使用限制。
注意事项
NAS为共享存储,一个NAS存储卷可以挂载到多个Pod上,可能出现多个Pod同时写入数据的问题,需应用自行确保数据一致性。关于NAS并发写入的一些限制条件,请参见如何避免多进程或多客户端并发写同一日志文件可能出现的异常?和如何解决向NFS文件系统中写入数据延迟问题?
NAS挂载点创建后,等待一定时间,待挂载点状态为可用后方可使用。请勿删除挂载点,否则会造成系统无响应。
在使用极速型NAS文件系统时,配置动态存储卷StorageClass中的
path
需要以/share
为父目录。例如,0cd8b4a576-g****.cn-hangzhou.nas.aliyuncs.com:/share/subpath
表示Pod挂载的NAS文件系统的子目录为/share/subpath
。若您在应用模板中配置了securityContext.fsgroup参数,kubelet在存储卷挂载完成后会执行
chmod
或chown
操作,导致挂载时间延长。若已配置securityContext.fsgroup参数,且需要减少挂载时间。具体操作,请参见NAS存储卷挂载时间延长。
挂载说明
您可以通过subpath方式、sharepath方式以及filesystem方式挂载NAS动态存储卷,使用subpath方式和sharepath方式挂载时,您需要提前创建NAS文件系统和挂载点,使用filesystem方式挂载无需提前创建。
使用subpath方式挂载:当多个应用或者Pod需要挂载同一个NAS文件系统共享数据时,或者不同的Pod挂载同一个NAS文件系统的不同子目录。
使用sharepath方式挂载:如果您需要在多个跨命名空间的Pod中挂载同一个NAS目录。
使用filesystem方式挂载:当应用需要动态创建和删除NAS文件系统和挂载点时,CSI组件在PVC创建时会自动动态新建NAS文件系统和挂载点,创建一个PVC,就会创建一个NAS文件系统,PVC删除时动态删除挂载点和NAS文件系统。仅支持kubectl命令行操作。
步骤一:创建NAS文件系统和挂载点
不同类型的NAS文件系统支持的地域、可用区不同。请根据业务需求、集群所属地域和集群中Pod使用的VPC和交换机信息,确定所需要创建的NAS文件系统和挂载点。
通用型NAS与极速型NAS在挂载连通性、文件系统数量及协议类型等方面存在相应约束条件。更多信息,请参见使用限制。
步骤二:挂载NAS动态存储卷
使用subpath方式挂载
kubectl
1、创建存储类StorageClass
保存以下内容至alicloud-nas-subpath.yaml文件,并根据需求修改相关参数。
allowVolumeExpansion: true apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: alicloud-nas-subpath mountOptions: - nolock,tcp,noresvport - vers=3 parameters: volumeAs: subpath server: "0cd8b4a576-g****.cn-hangzhou.nas.aliyuncs.com:/k8s/" provisioner: nasplugin.csi.alibabacloud.com reclaimPolicy: Retain
参数
描述
allowVolumeExpansion
仅通用型NAS文件系统支持设置此参数。开启时,该StorageClass动态创建的PV将会被配置NAS目录配额,并支持通过编辑PVC进行卷容量扩容。
说明NAS配额的生效是异步的,即动态创建出PV后,目录配额不能保证立即生效,且快速连续写入大量数据可能会超出设置的容量上限。关于NAS目录配额的更多信息,请参见目录配额。
mountOptions
挂载NAS的
options
参数在mountOptions
中配置,包括NFS协议版本。volumeAs
设置为
subpath
。取值:subpath
:表示创建子目录类型的PV。您需要手动创建NAS文件系统以及挂载点。一个PV对应一个NAS文件系统的子目录。sharepath
:表示创建PV时不会创建实际的目录,将会直接使用StorageClass中设置的路径,这意味着每个PV实际上会对应同一个NAS目录,便于跨Namespace共享目录的使用场景。filesystem
:表示Provisioner会自动创建NAS文件系统,一个PV对应一个NAS文件系统。
server
表示创建子目录类型的PV时,NAS文件系统的挂载点地址,不设置则默认为/。
重要此处需替换为实际的挂载点地址,关于如何查看挂载点地址,请参见查看挂载点地址。
provisioner
驱动类型。本例中取值为
nasplugin.csi.alibabacloud.com
,表示使用阿里云NAS CSI插件。reclaimPolicy
PV的回收策略,默认为
Delete
,支持Retain
。Delete模式:需配合
archiveOnDelete
一起使用。当
archiveOnDelete
为true
时,删除PVC时,PV和NAS文件只会被重命名,不会被删除。当
archiveOnDelete
为false
时,删除PVC时,PV和NAS文件会被真正删除。
Retain模式:删除PVC的时候,PV和NAS文件系统不会被删除,需要您手动删除。
如果数据安全性要求高,推荐使用
Retain
方式以免误删数据。archiveOnDelete
表示在
reclaimPolicy
为Delete
时,是否删除后端存储。因为NAS为共享存储,添加此选项进行双重确认。在参数parameters
下配置。true
(默认):不会真正删除目录或文件,而是将其重命名,格式为archived-{pvName}.{timestamp}
。false
:会真正删除后端对应的存储资源。
说明业务流量非常大时,不建议配置为false。更多信息,请参见使用NAS动态存储卷时Controller的任务队列已满且无法创建新的PV。
执行以下命令创建StorageClass。
kubectl create -f alicloud-nas-subpath.yaml
2、创建PVC
保存以下内容至pvc.yaml文件,并根据需求修改相关参数。
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: nas-csi-pvc spec: accessModes: - ReadWriteMany storageClassName: alicloud-nas-subpath resources: requests: storage: 20Gi
参数
说明
name
PVC名称。
accessModes
配置访问模式。默认为
ReadWriteMany
,支持ReadWriteOnce
或ReadOnlyMany
。storageClassName
StorageClass的名称,用于绑定StorageClass。
storage
声明应用存储使用量。
重要NAS配置PVC的容量仅在文件系统类型为通用型NAS,且StorageClass设置
allowVolumeExpansion
为true
时才会生效。此时,CSI将按照PVC容量设置NAS目录配额。NAS目录配额单位为GiB,实际设置的容量上限为PVC容量按GiB单位向上取整。创建PVC。
kubectl create -f pvc.yaml
3、创建应用并挂载NAS
创建应用nginx-1和nginx-2,使其共享同一个NAS文件系统的同一个子目录。
保存以下内容至nginx-1.yaml文件中。
apiVersion: apps/v1 kind: Deployment metadata: name: deployment-nas-1 labels: app: nginx-1 spec: selector: matchLabels: app: nginx-1 template: metadata: labels: app: nginx-1 spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 volumeMounts: - name: nas-pvc mountPath: "/data" volumes: - name: nas-pvc persistentVolumeClaim: claimName: nas-csi-pvc
mountPath
:NAS在容器中挂载的位置。claimName
:PVC的名称,用于绑定PVC。本例中为nas-csi-pvc
。
保存以下内容至nginx-2.yaml文件中。
apiVersion: apps/v1 kind: Deployment metadata: name: deployment-nas-2 labels: app: nginx-2 spec: selector: matchLabels: app: nginx-2 template: metadata: labels: app: nginx-2 spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 volumeMounts: - name: nas-pvc mountPath: "/data" volumes: - name: nas-pvc persistentVolumeClaim: claimName: nas-csi-pvc
mountPath
:NAS在容器中挂载的位置。本例为/data
。claimName
:输入与nginx-1
应用相同的PVC名称,本例为nas-csi-pvc
。
创建应用nginx-1和nginx-2。
kubectl create -f nginx-1.yaml -f nginx-2.yaml
查看Pod信息。
kubectl get pod
预期输出:
NAME READY STATUS RESTARTS AGE deployment-nas-1-5b5cdb85f6-a**** 1/1 Running 0 32s deployment-nas-2-c5bb4746c-b**** 1/1 Running 0 32s
为不同的Pod挂载同一个NAS文件系统的同一个子目录
/data
,即挂载点为0cd8b4a576-g****.cn-hangzhou.nas.aliyuncs.com:/k8s/nas-79438493-f3e0-11e9-bbe5-00163e09****
的NAS存储卷已同时挂载到应用deployment-nas-1-5b5cdb85f6-a****
和deployment-nas-2-c5bb4746c-b****
的/data目录下。其中:/k8s
为StorageClass中指定的subpath。nas-79438493-f3e0-11e9-bbe5-00163e09****
为自动创建的NAS存储卷PV的名称。
说明如果需要为不同的Pod挂载同一个NAS文件系统的不同子目录,则需要分别创建pvc-1和nginx-1以及pvc-2和nginx-2。
控制台
1、创建存储类StorageClass
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在存储类页面,单击右上角的创建。
在创建对话框中,StorageClass的相关配置完成后,单击创建。
主要配置项如下所示。
配置项
说明
示例值
名称
StorageClass的名称。
名称必须以小写字母开头,只能包含小写字母、数字、小数点(.)和中划线(-)。
alicloud-nas-subpath
存储卷类型
选择NAS。
NAS
选择挂载点
NAS文件系统的挂载点地址。关于如何查看挂载点地址,请参见查看挂载点地址。
若无可选的挂载点地址,请先创建NAS文件系统。具体操作,请参见创建NAS文件系统和挂载点。
0cd8b4a576-g****.cn-hangzhou.nas.aliyuncs.com:/k8s/
存储卷模式
存储卷访问模式。默认为共享目录模式。取值:
共享目录:即Sharepath方式挂载,所有存储卷共享挂载路径,即数据将存储于
<bucket>:<path>/
下。子目录:即Subpath方式挂载,创建存储卷时在挂载路径下自动新建子目录,即数据将存储于
<bucket>:<path>/<pv-name>/
下。说明子目录模式仅在CSI组件为1.31.4及以上版本时生效,否则均为共享目录模式。
子目录
挂载路径
NAS文件系统中的挂载路径。
如果NAS根目录下没有此子目录,会默认创建后再进行挂载。
您可以不填此项,默认挂载到NAS根目录。
极速型NAS需要以
/share
为根目录,例如/share/data
。
/
回收策略
回收策略。支持Delete和Retain模式, 默认为Delete模式。
Delete模式:需配合
archiveOnDelete
一起使用。当
archiveOnDelete
为true
时,删除PVC时,PV和NAS文件只会被重命名,不会被删除。当
archiveOnDelete
为false
时,删除PVC时,PV和NAS文件会被真正删除。
Retain模式:删除PVC时,PV和NAS文件系统不会被删除,需要您手动删除。
如果对数据安全性要求较高,推荐使用Retain模式,以免误删数据。
Retain
挂载选项
挂载NAS的可选参数,包括NFS协议版本等。
NFS协议版本号推荐使用v3,且极速类型NAS仅支持v3。关于NFS协议的更多信息,请参见NFS协议。
保持默认
创建成功后,可在存储类列表查看创建的StorageClass。
2、创建PVC
在集群管理页左侧导航栏,选择 。
在存储声明页面,单击右上角的创建。
在弹出的创建存储声明页面中,配置完成后,单击创建。
配置项
说明
示例值
存储声明类型
选择NAS。
NAS
名称
创建的存储声明名称在集群内必须唯一。
pvc-nas
分配模式
本文中选择使用存储类动态创建。
使用存储类动态创建
已有存储类
单击选择存储类,在选择存储类对话框目标存储类右侧操作列单击选择。
选择上一步创建的alicloud-nas-subpath存储类
总量
创建存储卷的容量,此处设置的大小不会限制应用可使用的最大容量。
20Gi
访问模式
默认为ReadWriteMany,也可选择ReadWriteOnce或ReadOnlyMany。
ReadWriteMany
3、创建应用并挂载NAS
参考以下操作,分别创建应用 deployment-nas-1和 deployment-nas-2,使其共享同一个NAS文件系统的同一个子目录。
在集群管理页左侧导航栏,选择
。在无状态页面,单击使用镜像创建。
配置创建应用的参数信息。
主要参数如下,其他参数保持默认即可。更多信息,请参见创建无状态工作负载Deployment。
配置项
参数
说明
示例
应用基本信息
应用名称
Deployment名称,自定义输入。格式要求请参考界面提示。
deployment-nas-1
副本数量
Deployment的副本数量。
2
容器配置
镜像名称
用于部署应用的镜像地址。
anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
所需资源
所需的vCPU和内存资源。
0.25 vCPU,0.5 GiB
数据卷
单击增加云存储声明,然后完成参数配置。
挂载源:选择之前创建的PVC。
容器路径:输入NAS文件系统要挂载到的容器路径。
挂载源:pvc-nas
容器路径:/data
查看应用部署状态。
在无状态页面,单击应用名称。
在容器组页签下,确认Pod已正常运行(状态为Running)。
使用sharepath方式挂载
kubectl
1、创建存储类StorageClass
保存以下内容至alicloud-nas-subpath.yaml文件,并根据需求修改相关参数。
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: alicloud-nas-sharepath mountOptions: - nolock,tcp,noresvport - vers=3 parameters: volumeAs: sharepath server: "0cd8b4a576-g****.cn-hangzhou.nas.aliyuncs.com:/data" provisioner: nasplugin.csi.alibabacloud.com reclaimPolicy: Retain
参数
描述
mountOptions
挂载NAS的可选参数,包括NFS协议版本等。
NFS协议版本号推荐使用v3,且极速类型NAS仅支持v3。关于NFS协议的更多信息,请参见NFS协议。
volumeAs
设置为
sharepath
。取值:subpath
:表示创建子目录类型的PV。您需要手动创建NAS文件系统以及挂载点。一个PV对应一个NAS文件系统的子目录。sharepath
:表示创建PV时不会创建实际的目录,将会直接使用StorageClass里设置的路径,这意味着每个PV实际上会对应同一个NAS目录,便于跨namespace共享目录使用场景。filesystem
:表示Provisioner会自动创建NAS文件系统,一个PV对应一个NAS文件系统。
server
表示创建子目录类型的PV时,NAS文件系统的挂载点地址以及路径,不设置路径则默认为
/
。重要此处需替换为实际的挂载点地址,关于如何查看挂载点地址,请参见查看挂载点地址。
provisioner
驱动类型。此处须配置为
nasplugin.csi.alibabacloud.com
,表示使用阿里云NAS CSI组件。reclaimPolicy
使用
sharepath
时必须要设置为Retain
。创建StorageClass。
kubectl create -f alicloud-nas-sharepath.yaml
2、在两个不同命名空间下创建PVC
为实现跨命名空间下Pod的挂载NAS,您需要先创建两个不同的命名空间。
执行以下命令,创建命名空间ns1和ns2。
kubectl create ns ns1 kubectl create ns ns2
保存以下内容至pvc.yaml文件,并根据需求修改相关参数。
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: nas-csi-pvc namespace: ns1 spec: accessModes: - ReadWriteMany storageClassName: alicloud-nas-sharepath resources: requests: storage: 20Gi --- kind: PersistentVolumeClaim apiVersion: v1 metadata: name: nas-csi-pvc namespace: ns2 spec: accessModes: - ReadWriteMany storageClassName: alicloud-nas-sharepath resources: requests: storage: 20Gi
参数
说明
name
PVC名称。
accessModes
配置访问模式。默认为
ReadWriteMany
,支持ReadWriteOnce
或ReadOnlyMany
。storageClassName
StorageClass的名称,用于绑定StorageClass。
storage
声明应用存储使用量。
重要使用sharepath时,声明不会实际产生效果。
创建PVC。
kubectl create -f pvc.yaml
3、创建应用并挂载
在两个不同命名空间下分别创建应用,挂载相应命名空间下创建的PVC,它们将共享StorageClass中定义的NAS目录。
保存以下内容至nginx.yaml文件中,包含两个 Deployment。
apiVersion: apps/v1 kind: Deployment metadata: name: nginx namespace: ns1 spec: selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 volumeMounts: - name: nas-pvc mountPath: "/data" volumes: - name: nas-pvc persistentVolumeClaim: claimName: nas-csi-pvc --- apiVersion: apps/v1 kind: Deployment metadata: name: nginx namespace: ns2 spec: selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 volumeMounts: - name: nas-pvc mountPath: "/data" volumes: - name: nas-pvc persistentVolumeClaim: claimName: nas-csi-pvc
mountPath
:NAS在容器中挂载的位置。claimName
:PVC的名称,用于绑定PVC。本例中为nas-csi-pvc
。
创建应用。
kubectl create -f nginx.yaml
查看Pod信息。
kubectl get pod -A -l app=nginx
预期输出:
NAMESPACE NAME READY STATUS RESTARTS AGE ns1 nginx-5b5cdb85f6-a**** 1/1 Running 0 32s ns2 nginx-c5bb4746c-b**** 1/1 Running 0 32s
为不同命名空间的Pod挂载同一个NAS文件系统的同一个子目录
/data
,即挂载点为0cd8b4a576-g****.cn-hangzhou.nas.aliyuncs.com:/data
的NAS存储卷已同时挂载到应用nginx-5b5cdb85f6-a****
和nginx-c5bb4746c-b****
的/data目录下。
控制台
1、创建存储类StorageClass
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在存储类页面,单击右上角的创建。
在创建对话框中,StorageClass的相关配置完成后,单击创建。
主要配置项如下所示。
配置项
说明
示例值
名称
StorageClass的名称。
名称必须以小写字母开头,只能包含小写字母、数字、小数点(.)和中划线(-)。
alicloud-nas-sharepath
存储卷类型
选择NAS。
NAS
选择挂载点
NAS文件系统的挂载点地址。关于如何查看挂载点地址,请参见查看挂载点地址。
若无可选的挂载点地址,请先创建NAS文件系统。具体操作,请参见创建NAS文件系统和挂载点。
0cd8b4a576-g****.cn-hangzhou.nas.aliyuncs.com:/data
存储卷模式
存储卷访问模式。默认为共享目录模式。取值:
共享目录:即Sharepath方式挂载,表示创建PV时不会创建实际的目录,将会直接使用StorageClass里设置的路径,这意味着每个PV实际上会对应同一个NAS目录,便于跨Namespace共享目录使用场景。
子目录:即Subpath方式挂载,表示创建子目录类型的PV。您需要手动创建NAS文件系统以及挂载点。一个PV对应一个NAS文件系统的子目录。
共享目录
挂载路径
NAS文件系统中的挂载路径。
如果NAS根目录下没有此子目录,会默认创建后再进行挂载。
您可以不填此项,默认挂载到NAS根目录。
极速型NAS需要以
/share
为根目录,例如/share/data
。
/
回收策略
使用
sharepath
时必须要设置为Retain
。Retain
挂载选项
挂载NAS的可选参数,包括NFS协议版本等。
NFS协议版本号推荐使用v3,且极速类型NAS仅支持v3。关于NFS协议的更多信息,请参见NFS协议。
保持默认
创建成功后,可在存储类列表查看创建的StorageClass。
2、创建PVC
为实现应用跨Namespace共享目录的挂载,您需要首先在控制台创建命名空间ns1和ns2。
创建命名空间ns1和ns2,请参见创建命名空间。
在集群管理页左侧导航栏,选择 。
在存储声明页面,选择命名空间为ns1,单击创建。
在弹出的创建存储声明页面中,配置完成后,单击创建。
配置项
说明
示例值
存储声明类型
选择NAS。
NAS
名称
创建的存储声明名称在集群内必须唯一。
pvc-nas
分配模式
本文中选择使用存储类动态创建。
使用存储类动态创建
已有存储类
单击选择存储类,在选择存储类对话框目标存储类右侧操作列单击选择。
选择上一步创建的存储类alicloud-nas-sharepath
总量
创建存储卷的容量。
20Gi
访问模式
默认为ReadWriteMany,也可选择ReadWriteOnce或ReadOnlyMany。
ReadWriteMany
参考以上操作,在命名空间ns2下创建pvc-nas。
3、创建应用并挂载NAS
在集群管理页左侧导航栏,选择
。在无状态页面,选择命名空间为ns1,单击使用镜像创建。
配置创建应用的参数信息。
主要参数如下,其他参数保持默认即可。更多信息,请参见创建无状态工作负载Deployment。
配置项
参数
说明
示例
应用基本信息
应用名称
Deployment名称,自定义输入。格式要求请参考界面提示。
nginx
副本数量
Deployment的副本数量。
2
容器配置
镜像名称
用于部署应用的镜像地址。
anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
所需资源
所需的vCPU和内存资源。
0.25 vCPU,0.5 GiB
数据卷
单击增加云存储声明,然后完成参数配置。
挂载源:选择之前创建的PVC。
容器路径:输入NAS文件系统要挂载到的容器路径。
挂载源:pvc-nas
容器路径:/data
参考以上操作,在命名空间ns2下创建应用nginx。
查看应用部署状态。
在无状态页面,单击应用名称。
在容器组页签下,确认Pod已正常运行(状态为Running)。
步骤三:验证NAS的存储特性
以上创建的工作负载Deployment中包含2个Pod,2个Pod挂载了同一个NAS文件系统,您可以通过以下方式对NAS存储卷进行共享存储和持久化存储验证。
重建Pod,然后在新建的Pod中查看NAS文件系统中的数据是否存在,以此来验证持久化存储。
在一个Pod中创建文件,然后在另一个Pod中查看文件,以此来验证共享存储。
验证NAS的持久化存储
查看应用所在的Pod。
kubectl get pod
预期输出:
NAME READY STATUS RESTARTS AGE deployment-nas-1-5b5cdb85f6-a**** 1/1 Running 0 32s deployment-nas-2-c5bb4746c-b**** 1/1 Running 0 32s
在一个Pod中创建文件。
查看应用中挂载的
/data
路径下有无文件。以一个名为
deployment-nas-1-5b5cdb85f6-a****
的Pod为例。kubectl exec deployment-nas-1-5b5cdb85f6-a**** -- ls /data
无返回结果,表明/data路径下无文件。
在该Pod的
/data
路径下创建文件nas。kubectl exec deployment-nas-1-5b5cdb85f6-a**** -- touch /data/nas
在另一个Pod中查看建文件。
以另一个名为
deployment-nas-2-c5bb4746c-b****
的Pod为例。kubectl exec deployment-nas-2-c5bb4746c-b**** -- ls /data
预期输出:
nas
重建Pod。
删除Pod。
kubectl delete pod deployment-nas-1-5b5cdb85f6-a****
同时在另一个窗口中,查看Pod删除及Kubernetes重建Pod的过程。
kubectl get pod -w -l app=nginx
验证删除Pod后,NAS里创建的文件是否还存在。
查看重建的Pod名称。
kubectl get pod
预期输出:
NAME READY STATUS RESTARTS AGE deployment-nas-1-5b5cdm2g5-c**** 1/1 Running 0 32s deployment-nas-2-c5bb4746c-b**** 1/1 Running 0 32s
查看重建Pod的
/data
路径下的文件。以名为deployment-nas-1-5b5cdm2g5-c**** 的Pod为例。
kubectl exec deployment-nas-1-5b5cdm2g5-c**** -- ls /data
预期输出:
nas
nas
文件仍然存在,表明NAS的数据可持久化保存。
验证NAS的共享存储
NAS存储卷支持同时被多个Pod挂载,当某个Pod修改数据时,其余Pod将自行实现数据的同步,根据以下示例验证NAS存储卷的共享存储特性:
查看部署的应用所在的Pod和NAS文件。
执行以下命令,查看应用所在的Pod名称。
kubectl get pod
预期输出:
NAME READY STATUS RESTARTS AGE deployment-nas-1-5b5cdb85f6-a**** 1/1 Running 0 32s deployment-nas-2-c5bb4746c-b**** 1/1 Running 0 32s
查看2个Pod的
/data
路径下的文件。kubectl exec deployment-nas-1-5b5cdb85f6-a**** -- ls /data kubectl exec deployment-nas-2-c5bb4746c-b**** -- ls /data
无返回结果,说明当前存储路径
/data
下无文件。
在任意一个Pod的
/data
路径下创建文件nas。以名为
deployment-nas-1-5b5cdb85f6-a****
的Pod为例。kubectl exec deployment-nas-1-5b5cdb85f6-a**** -- touch /data/nas
查看2个Pod的
/data
路径下的文件。查看名为
deployment-nas-1-5b5cdb85f6-a****
的Pod的/data
路径下的文件。kubectl exec deployment-nas-1-5b5cdb85f6-a**** -- ls /data
预期输出:
nas
查看另一个名为
deployment-nas-2-c5bb4746c-b****
的Pod的/data
路径下的文件。kubectl exec deployment-nas-2-c5bb4746c-b**** -- ls /data
预期输出:
nas
在任意一个Pod的
/data
下创建的文件,两个Pod下的/data
路径下均存在此文件,说明两个Pod共享一个NAS。
常见问题
如何实现NAS的用户或用户组隔离?
为确保不同用户和用户组之间数据的安全性,您可以参考以下操作对NAS的用户或用户组进行隔离。
使用以下YAML内容,在容器组内使用nobody用户启动进程,创建的目录UID和GID为65534。
apiVersion: apps/v1 kind: StatefulSet metadata: name: nas-sts spec: selector: matchLabels: app: busybox serviceName: "busybox" replicas: 1 template: metadata: labels: app: busybox spec: securityContext: fsGroup: 65534 #创建目录/文件时,UID/GID为65534(nobody用户)。 fsGroupChangePolicy: "OnRootMismatch" #只有根目录的属主与访问权限与卷所期望的权限不一致时, 才改变其中内容的属主和访问权限。 containers: - name: busybox image: busybox command: - sleep - "3600" securityContext: runAsUser: 65534 #所有容器内的进程都使用用户ID为65534(nobody用户)来运行。 runAsGroup: 65534 #所有容器中的进程都以主组ID为65534(nobody用户)来运行。 allowPrivilegeEscalation: false volumeMounts: - name: nas-pvc mountPath: /data volumeClaimTemplates: - metadata: name: nas-pvc spec: accessModes: [ "ReadWriteOnce" ] storageClassName: "alicloud-nas-subpath" resources: requests: storage: 100Gi
执行以下命令,在容器中启动
top
命令,查看USER是否为nobody。kubectl exec nas-sts-0 -- "top"
预期输出:
Mem: 11538180K used, 52037796K free, 5052K shrd, 253696K buff, 8865272K cached CPU: 0.1% usr 0.1% sys 0.0% nic 99.7% idle 0.0% io 0.0% irq 0.0% sirq Load average: 0.76 0.60 0.58 1/1458 54 PID PPID USER STAT VSZ %VSZ CPU %CPU COMMAND 49 0 nobody R 1328 0.0 9 0.0 top 1 0 nobody S 1316 0.0 10 0.0 sleep 3600
预期输出表明,是
nobody
用户执行的top
命令。执行以下命令,验证在NAS挂载目录下创建的目录和文件是否为
nobody
。kubectl exec nas-sts-0 -- sh -c "touch /data/test; mkdir /data/test-dir; ls -arlth /data/"
预期输出:
total 5K drwxr-xr-x 1 root root 4.0K Aug 30 10:14 .. drwxr-sr-x 2 nobody nobody 4.0K Aug 30 10:14 test-dir -rw-r--r-- 1 nobody nobody 0 Aug 30 10:14 test drwxrwsrwx 3 root nobody 4.0K Aug 30 10:14 .
预期输出表明,在
/data
下创建的test文件和test-dir目录中,UID和GID对应的用户均为nobody用户。
如何使用filesystem方式挂载NAS动态存储卷?
当应用需要动态创建和删除NAS文件系统和挂载点时,您可以使用filesystem方式挂载NAS,此场景下,CSI在PVC创建时将自动动态新建NAS文件系统和挂载点,PVC删除时动态删除挂载点和NAS文件系统。使用filesystem类型NAS存储卷的Pod只能创建一个文件系统和一个挂载点。
相关文档
如需通过TLS挂载,请参见如何通过CSI使用TLS挂载NAS文件系统?
如需使用CNFS托管NAS文件系统,请参见通过CNFS管理NAS文件系统(推荐)。
如需动态扩容NAS存储卷,请参见使用CNFS自动扩容NAS存储卷。
如需通过NAS的目录配额功能,实现对存储卷空间的有效控制。请参见扩容NAS存储卷容量。