NAS存储卷是一种可共享访问、弹性扩展、高可靠以及高性能的分布式文件系统,适用于大数据分析、共享数据、Web应用以及保存日志等场景。通过CSI组件,您可以使用已有的NAS创建PV和PVC,并在工作负载中挂载,实现数据的持久化存储和共享存储。
前提条件
集群默认已安装CSI组件。如需升级请参见升级csi-plugin和csi-provisioner。
说明如果您集群中使用Flexvolume组件,由于Flexvolume已废弃,请参见迁移Flexvolume至CSI完成迁移后再进行挂载。您可以在 ,在存储页签下确认存储组件类型。
已通过kubectl连接集群。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群。
确认已有NAS满足以下条件,否则请重新创建满足条件的NAS或者使用NAS动态存储卷。创建操作,请参见创建文件系统。
协议类型为NFS。极速型NAS仅支持NFSv3。
挂载点和集群节点在同一VPC内,且状态为可用。如需添加挂载点,请参见管理挂载点。
说明如需加密NAS存储卷中的数据,支持创建NAS文件系统时配置加密类型。
使用限制
不支持挂载SMB协议的NAS文件系统。
通用NAS与极速NAS在挂载连通性、文件系统数量及协议类型等方面存在相应约束条件。更多信息,请参见使用限制。
NAS静态存储卷不支持扩容。
注意事项
NAS为共享存储,一个NAS存储卷可以挂载到多个Pod上,可能出现多个Pod同时写入数据的问题,需应用自行确保数据一致性。关于NAS并发写入的一些限制条件,请参见如何避免多进程或多客户端并发写同一日志文件可能出现的异常?和如何解决向NFS文件系统中写入数据延迟问题?
请勿删除NAS挂载点,否则会造成操作系统无响应。
在使用极速型NAS文件系统时,配置存储卷的
path
需要以/share
为父目录。例如,Pod挂载的NAS文件系统子目录可配置为/share/path1
。若您在应用模板中配置了securityContext.fsgroup参数,kubelet在存储卷挂载完成后会执行
chmod
或chown
操作,导致挂载时间延长。若已配置securityContext.fsgroup参数,且需要减少挂载时间。具体操作,请参见NAS存储卷挂载时间延长。
步骤一:挂载NAS静态存储卷
kubectl
创建静态PV。
将以下示例YAML内容保存为pv-nas.yaml文件。
apiVersion: v1 kind: PersistentVolume metadata: name: pv-nas labels: alicloud-pvname: pv-nas spec: capacity: storage: 5Gi accessModes: - ReadWriteMany csi: driver: nasplugin.csi.alibabacloud.com volumeHandle: pv-nas # 必须与PV Name保持一致。 volumeAttributes: server: "0c47****-mpk25.cn-shenzhen.nas.aliyuncs.com" # NAS挂载点,与集群VPC一致。 path: "/csi" # 挂载子目录。 mountOptions: - nolock,tcp,noresvport - vers=3
参数
说明
name
PV的名称。
labels
设置PV的标签。
storage
NAS的可使用量。
说明NAS存储卷在实际使用中,不受此storage使用量限制,根据不同NAS使用限制确认NAS存储卷最终可使用的容量。
accessModes
配置访问模式,默认为
ReadWriteMany
,也支持ReadWriteOnce
和ReadOnlyMany
。driver
驱动类型。此处必须配置为
nasplugin.csi.alibabacloud.com
,表示使用阿里云NAS CSI插件。volumeHandle
配置PV的唯一标识符,必须与PV Name保持一致。若需要同时使用多个PV,则各个PV中该值须唯一。
server
NAS挂载点地址,必须与集群VPC一致。
说明替换为实际的挂载点地址,如何查看挂载点地址,请参见查看挂载点地址。
path
在容器中挂载NAS存储卷的子目录。通用型NAS的父目录为/。
重要极速型NAS需要以
/share
为父目录,则此处子目录应为/share/csi
。mountOptions
挂载NAS的
options
参数在mountOptions
中配置,包括NFS协议版本。挂载NAS存储卷的NFS协议版本号,推荐使用v3,极速类型NAS仅支持v3。关于NFS协议的更多信息,请参见NFS协议。创建静态PV。
kubectl create -f pv-nas.yaml
创建NAS存储声明PVC,使用selector筛选PV,精确配置PVC和PV的绑定关系。
将以下示例YAML内容保存至pvc-nas.yaml文件。
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: pvc-nas spec: accessModes: - ReadWriteMany resources: requests: storage: 5Gi selector: matchLabels: alicloud-pvname: pv-nas
参数
说明
示例值
name
PVC名称。
pvc-nas
accessModes
访问模式。默认为
ReadWriteMany
,也支持ReadWriteOnce
或ReadOnlyMany
。ReadWriteMany
storage
声明应用使用NAS存储卷的容量,不能大于存储卷的总量。
说明NAS存储卷在实际使用中,不受此storage使用量限制,根据不同NAS使用限制确认NAS存储卷最终可使用的容量。
5Gi
matchLabels
输入PV的标签,用于关联PV。
pv-nas
创建静态PVC。
kubectl create -f pvc-nas.yaml
创建名为nas-static的应用,并挂载PVC。
以下为创建nas-static应用的nas.yaml示例文件。
apiVersion: apps/v1 kind: Deployment metadata: name: nas-static labels: app: nginx spec: replicas: 2 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: pvc-nas mountPath: "/data" volumes: - name: pvc-nas persistentVolumeClaim: claimName: pvc-nas
参数
说明
mountPath
NAS在容器中挂载的位置。
claimName
PVC的名称,用于绑定PVC。
创建名为nas-static的应用,并挂载PVC。
kubectl create -f nas.yaml
查看Pod信息。
kubectl get pod
预期输出:
NAME READY STATUS RESTARTS AGE nas-static-5b5cdb85f6-n**** 1/1 Running 0 32s nas-static-c5bb4746c-4**** 1/1 Running 0 32s
控制台
步骤一:创建PV
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在存储卷页面,单击创建。
在创建存储卷页面配置参数,配置完成后,单击创建。
配置项
说明
示例值
存储卷类型
选择NAS。
NAS
名称
存储卷名称。在集群内必须唯一。
pv-nas
总量
存储卷的容量。
说明NAS文件系统本身不限制使用量。此处不是NAS文件系统的使用限额,只是所创建存储卷的容量声明。
20Gi
访问模式
支持ReadWriteMany和ReadWriteOnce。默认为ReadWriteMany。
ReadWriteMany
是否使用CNFS
是否使用CNFS功能。开启后,您需要进行以下操作:
选择对应的CNFS或新建CNFS。关于CNFS的更多信息,请参见创建CNFS管理NAS文件系统(推荐)。
是否开启CNFS加速功能,关于CNFS加速更多信息,请参见开启CNFS NAS计算端分布式缓存。
开启
挂载点域名
仅在未开启CNFS时,需要设置。
您可以通过选择挂载点或者自定义的方式配置要挂载的NAS文件系统目录。关于如何查看挂载点地址,请参见查看挂载点地址。
0c47****-mpk25.cn-shenzhen.nas.aliyuncs.co
高级选项(选填)
挂载路径:NAS文件系统中的挂载路径。以
/
为根目录,设定后存储卷将挂载到指定的子目录。如果NAS根目录下没有此子目录,会默认创建后再进行挂载。
您可以不填此项,默认挂载到NAS根目录。
极速型NAS需要以
/share
为根目录,例如/share/data
。
/data
回收策略:默认为Delete,支持Retain。
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协议。
v3
标签
为该存储卷添加标签。
pv-nas
创建完成后,在存储卷页面可以看到新创建的PV。
步骤二:创建PVC
在集群管理页左侧导航栏,选择 。
在存储声明页面,单击创建。
在创建存储声明页面配置参数。配置完成后,单击创建。
参数
说明
示例值
存储声明类型
选择NAS。
NAS
名称
存储声明名称在集群内必须唯一。
pvc-nas
分配模式
选择已有存储卷。
说明若未创建存储卷,您可以设置分配模式为创建存储卷,配置创建存储卷参数。
选择已有存储卷
已有存储卷
单击选择已有存储卷,在目标存储卷右侧操作列单击选择,选择存储卷。
已有存储卷
总量
声明所需使用的存储卷的容量。
说明所创建存储卷声明的容量不能超过待挂载的存储卷容量。
20
访问模式
默认为ReadWriteMany,也可选择ReadWriteOnce或ReadOnlyMany。
ReadWriteMany
步骤三:创建应用
在集群管理页左侧导航栏,选择
。在无状态页面,单击使用镜像创建。
配置创建应用的参数信息,配置完成后,单击创建。
主要参数如下,其他参数保持默认即可。更多信息,请参见创建无状态工作负载Deployment。
配置项
参数
说明
示例
应用基本信息
应用名称
Deployment名称,自定义输入。格式要求请参考界面提示。
test-nas
副本数量
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)。
步骤二:验证NAS存储特性
以上创建的工作负载Deployment中包含2个Pod,2个Pod挂载了同一个NAS文件系统,您可以通过以下方式对NAS存储卷进行共享存储和持久化存储验证。
重建Pod,然后在新建的Pod中查看NAS文件系统中的数据是否存在,以此来验证持久化存储。
在一个Pod中创建文件,然后在另一个Pod中查看文件,以此来验证共享存储。
验证NAS的持久化存储
查看应用所在的Pod。
kubectl get pod
预期输出:
NAME READY STATUS RESTARTS AGE nas-static-5b5cdb85f6-a**** 1/1 Running 0 32s nas-static-c5bb4746c-b**** 1/1 Running 0 32s
在一个Pod中创建文件。
查看应用中挂载的
/data
路径下有无文件。以一个名为
nas-static-5b5cdb85f6-a****
的Pod为例。kubectl exec nas-static-5b5cdb85f6-a**** -- ls /data
无返回结果,说明当前存储路径
/data
下无文件。在该Pod的
/data
路径下创建文件nas。kubectl exec nas-static-5b5cdb85f6-a**** -- touch /data/nas
在另一个Pod中查看文件。
以另一个名为
nas-static-5b5cdb85f6-b****
的Pod为例。kubectl exec nas-static-5b5cdb85f6-b**** -- ls /data
预期输出:
nas
重建Pod。
删除Pod。
kubectl delete pod nas-static-5b5cdb85f6-a****
同时在另一个窗口中,查看Pod删除及Kubernetes重建Pod的过程。
kubectl get pod -w -l app=nginx
验证删除Pod后,NAS里创建的文件是否还存在。
查看重建的Pod名称。
kubectl get pod
预期输出:
NAME READY STATUS RESTARTS AGE nas-static-5b5cdb85f6-c**** 1/1 Running 0 32s nas-static-c5bb4746c-a**** 1/1 Running 0 32s
查看重建Pod的
/data
路径下的文件。以名为
nas-static-5b5cdb85f6-c****
的Pod为例。kubectl exec nas-static-5b5cdb85f6-c**** -- ls /data
预期输出:
nas
nas文件仍然存在,表明NAS的数据可持久化保存。
验证NAS的共享存储
查看应用所在的Pod。
kubectl get pod
预期输出:
NAME READY STATUS RESTARTS AGE nas-static-5b5cdb85f6-n**** 1/1 Running 0 32s nas-static-c5bb4746c-4**** 1/1 Running 0 32s
查看两个Pod的
/data
路径下的文件。kubectl exec nas-static-5b5cdb85f6-n**** -- ls /data kubectl exec nas-static-c5bb4746c-4**** -- ls /data
无返回结果,说明当前存储路径
/data
下无文件。在任意一个Pod 的
/data
路径下创建文件nas。以名为
nas-static-5b5cdb85f6-n****
的Pod为例。kubectl exec nas-static-5b5cdb85f6-n**** -- touch /data/nas
查看两个Pod的
/data
路径下的文件。查看其中一个名为
nas-static-5b5cdb85f6-n****
的Pod 的/data
路径下的文件。kubectl exec nas-static-5b5cdb85f6-n**** -- ls /data
预期输出:
nas
查看另一个名为
nas-static-c5bb4746c-4****
的Pod 的/data
路径下的文件。kubectl exec nas-static-c5bb4746c-4**** -- ls /data
预期输出:
nas
如果在任意一个Pod的
/data
下创建的文件,在两个Pod的/data
路径下均存在此文件,表明两个Pod共享一个NAS。
相关文档
如需通过TLS挂载,请参见如何通过CSI使用TLS挂载NAS文件系统?
使用NAS存储卷时,如遇到权限无法访问的问题,请参见使用NAS存储卷时,提示chown: Operation not permitted解决。
为确保不同用户和用户组之间数据的安全性,您可以参考如何实现NAS的用户或用户组隔离解决。
如果您在使用NAS过程中遇到读写访问的问题,可参见读写访问文件类问题进行排查。
您可以使用NAS动态存储卷根据需求动态调整存储卷大小。
您可以使用通用型NAS的目录配额功能,实现对NAS存储卷空间的有效控制。请参见扩容NAS存储卷容量。
您可以直接使用NAS存储卷,也可以使用CNFS管理NAS存储卷来提升NAS的性能和QoS控制。