NAS存储卷是一种可共享访问、弹性扩展、高可靠以及高性能的分布式文件系统。本文介绍如何使用阿里云NAS静态存储卷,以及如何实现持久化存储与共享存储。
前提条件
- 已创建ACK Serverless集群。具体操作,请参见创建ACK Serverless集群。 
- 已创建NAS文件系统。具体操作,请参见创建文件系统。 - 若需要加密NAS存储卷中的数据,创建NAS文件系统时请配置加密类型。 
- 已创建NAS挂载点。具体操作,请参见管理挂载点。 - NAS挂载点需要和集群节点在同一个VPC内。 
- 已通过kubectl工具连接集群。具体操作,请参见通过kubectl连接Kubernetes集群。 
使用场景
- 对磁盘I/O要求较高的应用。 
- 可实现跨主机文件共享,例如可作为文件服务器。 
注意事项
- 在使用极速NAS文件系统时,配置数据卷的 - path需要以/share为父目录。例如,Pod挂载的NAS文件系统子目录可配置为/share/path1。
- NAS支持同时被多个Pod挂载,此时多个Pod可能同时修改相同数据,需要应用自行实现数据的同步。 说明- NAS存储的/目录不支持修改权限、属主和属组。 
- 若您在应用模板中配置了securityContext.fsgroup参数,Kubelet在存储卷挂载完成后会执行 - chmod或- chown操作,导致挂载时间延长。说明- 若已配置securityContext.fsgroup参数,且需要减少挂载时间。具体操作,请参见NAS存储卷挂载时间延长。 
通过控制台的方式使用NAS静态存储卷
步骤一:创建PV
- 登录,在左侧导航栏选择集群列表。 
- 在集群列表页面,单击目标集群名称或者目标集群右侧操作列下的详情。 
- 在集群管理页左侧导航栏,选择。 
- 在存储卷页面单击右上角的创建。 
- 在创建存储卷对话框中配置参数。 - 参数 - 说明 - 存储卷类型 - 支持云盘、NAS两种云存储类型。本文中选择为NAS。 - 名称 - 创建的数据卷的名称。数据卷名在集群内必须唯一。本例为pv-nas。 - 总量 - 所创建存储卷的容量。注意NAS文件系统本身不限制使用量。此处不是NAS文件系统的使用限额,只是所创建存储卷的容量声明。 - 访问模式 - 选择ReadWriteMany和ReadWriteOnce。默认为ReadWriteMany。 - 挂载点域名 - 您可以通过选择挂载点或者自定义的方式定义集群在NAS文件系统中挂载点的挂载地址。 - 显示高级选项 - 子目录:NAS路径下的子目录,以/为根目录,设定后数据卷将挂载到指定的子目录。 - 如果NAS根目录下没有此子目录,会默认创建后再挂载。 
- 您可以不填此项,默认挂载到NAS根目录。 
- 极速NAS需要以/share为父目录。 
 
- 版本:所创建存储卷的版本。 
 - 标签 - 为该存储卷添加标签。 
- 参数配置完成后,单击创建。 
步骤二:创建PVC
- 在集群管理页左侧导航栏,选择。 
- 在存储声明页面,单击右上角的创建。 
- 在弹出的创建存储声明对话框中,填写界面参数。 - 参数 - 说明 - 存储声明类型 - 支持云盘、NAS两种云存储类型。 本文中选择NAS。 - 名称 - 创建的存储声明名称在集群内必须唯一。 - 分配模式 - 选择已有存储卷。 说明- 若未创建存储卷,您可以设置分配模式为创建存储卷,配置创建存储卷参数。更多信息,请参见创建PV。 - 已有存储卷 - 单击选择已有存储卷,在目标存储卷右侧操作列单击选择,选择存储卷。 - 总量 - 所创建存储卷的容量。 说明- 所创建存储卷声明的容量不能超过待挂载的存储卷容量。 
- 单击创建。 - 创建成功后可以在列表中看到创建的存储声明,并且已绑定相应的存储卷。 
步骤三:创建应用
- 在集群管理页左侧导航栏,选择。 
- 在无状态页面,单击使用镜像创建。 
- 配置创建应用的参数信息。 - 以下主要为您介绍数据卷的配置。关于其他参数的描述,请参见创建无状态工作负载Deployment。 - ACK Serverless数据卷支持配置本地存储和云存储。 - 本地存储:支持配置项(ConfigMap)、保密字典(Secret)和临时目录,将对应的挂载源挂载到容器路径中。更多信息,请参见Volumes。 
- 云存储:支持云存储类型。 
 - 本例中配置了一个NAS类型的数据卷,将该NAS存储卷挂载到容器中/tmp路径下。  
- 所有的信息都配置完成后,单击创建。 - 创建成功后,您就可以正常使用数据卷。 
通过kubectl命令行方式使用NAS静态存储卷
- 执行以下命令创建静态PV。 - kubectl create -f pv-nas.yaml- 以下为创建静态卷PV的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 volumeAttributes: server: "2564f4****-ysu87.cn-shenzhen.nas.aliyuncs.com" path: "/csi" mountOptions: - nolock,tcp,noresvport - vers=3- 参数 - 说明 - name - PV的名称。 - labels - 设置PV的标签。 - storage - NAS的可使用量。 - accessModes - 配置访问模式。 - driver - 驱动类型。本例中取值为 - nasplugin.csi.alibabacloud.com,表示使用阿里云NAS CSI插件。- volumeHandle - 配置PV的唯一标识符。若需要同时使用多个PV,则各个PV中该值必须不一致。 - server - NAS挂载点。 - path - 挂载子目录,极速NAS需要以/share为父目录。 - vers - 挂载NAS数据卷的NFS协议版本号,推荐使用v3,极速类型NAS只支持v3。 
- 执行以下命令创建静态PVC。 - 创建NAS存储声明PVC,使用 - selector筛选PV,精确配置PVC和PV的绑定关系。- kubectl create -f pvc-nas.yaml- 以下为创建静态卷PVC的YAML示例文件。 - kind: PersistentVolumeClaim apiVersion: v1 metadata: name: pvc-nas spec: accessModes: - ReadWriteMany resources: requests: storage: 5Gi selector: matchLabels: alicloud-pvname: pv-nas- 参数 - 说明 - name - PVC的名称。 - accessModes - 配置访问模式。 - storage - 声明应用使用量,不能大于存储卷的总量。 - matchLabels - 输入PV的标签,用于关联PV。 
- 执行以下命令创建名为nas-static的应用,并挂载PVC。 - kubectl create -f nas.yaml- 以下为创建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: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest ports: - containerPort: 80 volumeMounts: - name: pvc-nas mountPath: "/data" volumes: - name: pvc-nas persistentVolumeClaim: claimName: pvc-nas- 参数 - 说明 - mountPath - NAS在容器中挂载的位置。 - claimName - PVC的名称,用于绑定PVC。 
- 执行以下命令,查看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
验证NAS的持久化存储
- 查看部署应用和NAS文件。 - 执行以下命令,查看部署的应用名称。 - 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
- 执行以下命令,查看任意一个应用的/data路径下的文件,本文以名为 - nas-static-5b5cdb85f6-n****的Pod为例。- kubectl exec nas-static-5b5cdb85f6-n**** -- ls /data- 无返回结果,说明/data路径下无文件。 
 
- 执行以下命令,在名为 - nas-static-5b5cdb85f6-n****Pod的/data路径下创建文件nas。- kubectl exec nas-static-5b5cdb85f6-n**** -- touch /data/nas
- 执行以下命令,查看名为 - nas-static-5b5cdb85f6-n****Pod的/data路径下的文件。- kubectl exec nas-static-5b5cdb85f6-n**** -- ls /data- 预期输出: - nas
- 执行以下命令,删除Pod。 - kubectl delete pod nas-static-5b5cdb85f6-n****
- 同时在另一个窗口中,执行以下命令,查看Pod删除及Kubernetes重建Pod的过程。 - kubectl get pod -w -l app=nginx
- 验证删除Pod后,NAS里创建的文件是否还存在。 - 执行以下命令,查看Kubernetes重建的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
- 执行以下命令,查看名为 - nas-static-5b5cdb85f6-n****的Pod在/data路径下的文件。- kubectl exec nas-static-5b5cdb85f6-n**** -- ls /data- 预期输出: - nas- nas文件仍然存在,说明NAS的数据可持久化保存。 
 
验证NAS的共享存储
- 查看部署的应用所在的Pod和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
- 执行以下命令,查看2个Pod /data路径下的文件。 - kubectl exec nas-static-5b5cdb85f6-n**** -- ls /data kubectl exec nas-static-c5bb4746c-4**** -- ls /data
 
- 执行以下命令,在任意一个Pod的/data路径下创建文件nas。 - kubectl exec nas-static-5b5cdb85f6-n**** -- touch /data/nas
- 执行以下命令,查看2个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。