NAS存储卷是一种可共享访问、弹性扩展、高可靠以及高性能的分布式文件系统,适用于大数据分析、共享数据、Web应用以及保存日志等场景。通过CSI组件,您可以使用已有的NAS创建PV和PVC,并在工作负载中挂载,实现数据的持久化存储和共享存储。
前提条件
- 集群默认已安装CSI组件。如需升级,请参见升级csi-plugin和csi-provisioner。 说明- 如果您集群中使用Flexvolume组件,由于Flexvolume已废弃,请参见迁移Flexvolume至CSI完成迁移后再进行挂载。您可以在,在存储页签下确认存储组件类型。 
- 确认已有NAS满足以下条件,否则请重新创建文件系统或者使用NAS动态存储卷。 - 协议类型为NFS。 - ACK不支持挂载SMB协议的NAS文件系统。 
- 挂载点和集群节点在同一VPC内,且状态为可用。如需添加挂载点,请参见管理挂载点。 - NAS文件系统只能挂载到相同VPC的Pod上,不支持跨VPC挂载。同一VPC下,NAS可以跨可用区挂载。 
 说明- 如需加密NAS存储卷中的数据,请在创建NAS文件系统时配置加密类型。 
注意事项
- NAS为共享存储,一个NAS存储卷可以挂载到多个Pod上,可能出现多个Pod同时写入数据的问题,需应用自行确保数据一致性。 - 关于NAS并发写入的一些限制条件,请参见如何避免多进程或多客户端并发写同一日志文件可能出现的异常?和如何解决向NFS文件系统中写入数据延迟问题? 
- 若您在应用模板中配置了 - securityContext.fsgroup参数,kubelet在存储卷挂载完成后会执行- chmod或- chown操作,导致挂载时间延长。若已配置- securityContext.fsgroup参数,且需要减少挂载时间。具体操作,请参见NAS存储卷挂载时间延长。
- 挂载NAS存储卷后,请勿删除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必须与集群所属VPC一致。 path: "/csi" # 挂载子目录。 mountOptions: - nolock,tcp,noresvport - vers=3- 参数 - 说明 - name- PV的名称。 - labels- 设置PV的标签。 - storage- PV的容量。 - accessModes- 配置访问模式,默认为 - ReadWriteMany,也支持- ReadWriteOnce和- ReadOnlyMany。- driver- 驱动类型。此处必须配置为 - nasplugin.csi.alibabacloud.com,表示使用阿里云NAS CSI插件。- volumeHandle- 配置PV的唯一标识符,必须与PV Name保持一致。若需要同时使用多个PV,则各个PV中该值须唯一。 - server- NAS挂载点地址。挂载点所属VPC必须与集群所属VPC一致。 - 关于如何查看挂载点地址,请参见管理挂载点。 - path- 要挂载的NAS子目录。 - 如果未设置,则默认挂载到根目录。 
- 如果NAS中没有该目录,会自动创建后再进行挂载。 
 说明- 通用型NAS的根目录为 - /,极速型NAS的根目录为- /share。挂载极速型NAS的子目录时,- path必须以- /share开头,如- /share/data。- mountOptions- NAS的挂载参数,包括NFS协议版本等。推荐使用NFS v3协议,极速型NAS仅支持NFS v3。关于NFS协议的更多信息,请参见NFS协议。 
- 创建PV。 - kubectl create -f pv-nas.yaml
- 查看PV。 - kubectl get pv- 预期返回: - NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE pv-nas 5Gi RWX Retain Available <unset> 25s
步骤二:创建PVC
- 将以下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名称。 - accessModes- 访问模式。默认为 - ReadWriteMany,也支持- ReadWriteOnce或- ReadOnlyMany。- storage- 声明所需使用的存储卷的容量。 - matchLabels- 输入PV的标签,用于关联PV。 
- 创建PVC。 - kubectl create -f pvc-nas.yaml
- 查看PVC。 - kubectl get pvc- 预期返回如下,可以看到PVC已关联PV。 - NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE pvc-nas Bound pv-nas 5Gi RWX <unset> 5s
步骤三:创建应用并挂载NAS
- 将以下YAML内容保存为nas.yaml。 - apiVersion: apps/v1 kind: Deployment metadata: name: nas-test 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。 
- 创建Deployment并挂载NAS。 - kubectl create -f nas.yaml
- 查看Deployment中Pod的部署情况。 - kubectl get pod -l app=nginx- 预期返回: - NAME READY STATUS RESTARTS AGE nas-test-****-***a 1/1 Running 0 32s nas-test-****-***b 1/1 Running 0 32s
挂载NAS静态存储卷(控制台)
步骤一:创建存储卷(PV)
- 登录容器服务管理控制台,在左侧导航栏选择集群列表。 
- 在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择。 
- 在存储卷页面,单击创建。 
- 在弹出的对话框中,完成参数配置,然后单击创建。 - 配置项 - 说明 - 示例值 - 存储卷类型 - 选择NAS。 - NAS - 名称 - 存储卷名称。在集群内必须唯一。 - pv-nas - 总量 - 存储卷的容量。 - 5Gi - 访问模式 - 支持ReadWriteMany和ReadWriteOnce。 - ReadWriteMany - 是否使用CNFS - 是否使用CNFS功能。基于CNFS托管NAS可以提升NAS的性能和QoS控制。 - 本文主要介绍如何直接使用已有NAS创建存储卷,不使用CNFS功能。如需使用CNFS配置已有NAS,请参见创建CNFS管理NAS文件系统(推荐)。 - 不开启 - 挂载点域名 - 仅在未开启CNFS时,需要设置。 - 您可以通过选择挂载点或者自定义的方式配置要挂载的NAS文件系统目录。关于如何查看挂载点地址,请参见管理挂载点。 - 0c47****-mpk25.cn-shenzhen.nas.aliyuncs.co - 高级选项(选填) - 挂载路径 - 要挂载的NAS子目录。 - 如果未设置,则默认挂载到根目录。 
- 如果NAS中没有该目录,会自动创建后再进行挂载。 
 说明- 通用型NAS的根目录为 - /,极速型NAS的根目录为- /share。挂载极速型NAS的子目录时,- path必须以- /share开头,如- /share/data。- /data - 回收策略 - 默认为Retain。表示删除PVC时,PV和NAS文件不会被删除,需要您手动删除。 说明- Delete需配合 - archiveOnDelete一起使用。由于静态PV暂不支持- archiveOnDelete,仅在此处选择Delete时,删除PVC时,不会真正删除PV和NAS文件。如需配置- archiveOnDelete,请使用NAS动态存储卷。- Retain - 挂载选项 - NAS的挂载参数,包括NFS协议版本等。推荐使用NFS v3协议,极速型NAS仅支持NFS v3。关于NFS协议的更多信息,请参见NFS协议。 - nolock,tcp,noresvport 
- vers=3 
 - 标签 - 为该存储卷添加标签。 - pv-nas - 创建完成后,在存储卷页面可以看到新创建的PV。 
步骤二:创建存储声明(PVC)
- 在集群管理页左侧导航栏,选择。 
- 在存储声明页面,单击创建。 
- 在弹出的对话框中,完成参数配置,然后单击创建。 - 参数 - 说明 - 示例值 - 存储声明类型 - 选择NAS。 - NAS - 名称 - 存储声明名称在集群内必须唯一。 - pvc-nas - 分配模式 - 选择已有存储卷。 说明- 若未创建存储卷,您可以设置分配模式为创建存储卷,配置创建存储卷参数。 - 选择已有存储卷 - 已有存储卷 - 单击选择已有存储卷,在目标存储卷右侧操作列单击选择,选择存储卷。 - pv-nas - 总量 - 声明所需使用的存储卷的容量。不能大于存储卷的总量。 - 5 - 访问模式 - 默认为ReadWriteMany,也可选择ReadWriteOnce或ReadOnlyMany。 - ReadWriteMany 
步骤三:创建应用并挂载NAS
- 在集群管理页左侧导航栏,选择。 
- 在无状态页面,单击使用镜像创建。 
- 配置创建应用的参数信息,配置完成后,单击创建。 - 主要参数如下,其他参数保持默认即可。更多信息,请参见创建无状态工作负载Deployment。 - 配置项 - 参数 - 说明 - 示例 - 应用基本信息 - 应用名称 - Deployment名称,自定义输入。格式要求请参考界面提示。 - nas-test - 副本数量 - Deployment的副本数量。 - 2 - 容器配置 - 镜像名称 - 用于部署应用的镜像地址。 - anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 - 所需资源 - 所需的vCPU和内存资源。 - 0.25 Core,512 MiB - 数据卷 - 单击增加云存储声明,然后完成参数配置。 - 挂载源:选择之前创建的PVC。 
- 容器路径:输入NAS文件系统要挂载到的容器路径。 
 - 挂载源:pvc-nas 
- 容器路径:/data 
 
- 查看应用部署状态。 - 在无状态页面,单击应用名称。 
- 在容器组页签下,确认Pod已正常运行(状态为Running)。 
 
验证NAS的共享存储和持久化存储
按照上文示例创建的Deployment中含有2个Pod,2个Pod挂载了同一NAS文件系统。您可以通过以下方式进行验证:
- 在一个Pod中创建文件,然后另一个Pod中查看文件,以此来验证共享存储。 
- 重建Deployment,然后在新创建的Pod中查看文件系统中的数据是否存在,以此来验证持久化存储。 
- 查看Pod信息。 - kubectl get pod | grep nas-test- 返回示例如下: - nas-test-*****a 1/1 Running 0 40s nas-test-*****b 1/1 Running 0 40s
- 验证共享存储。 - 在一个Pod中创建文件。 - 以名为 - nas-test-*****a的Pod作为示例:- kubectl exec nas-test-*****a -- touch /data/test.txt
- 在另一个Pod中查看文件。 - 以名为 - nas-test-*****b的Pod作为示例:- kubectl exec nas-test-*****b -- ls /data- 预期返回如下,可以看到已共享新建的文件 - test.txt。- test.txt
 
- 验证持久化存储。 - 重建Deployment。 - kubectl rollout restart deploy nas-test
- 查看Pod,等待新Pod创建成功。 - kubectl get pod | grep nas-test- 返回示例如下: - nas-test-*****c 1/1 Running 0 67s nas-test-*****d 1/1 Running 0 49s
- 在新Pod中查看文件系统中的数据是否存在。 - 以名为 - nas-test-*****c的Pod作为示例:- kubectl exec nas-test-*****c -- ls /data- 预期返回如下,可以看到NAS文件系统中的数据依然存在,在新Pod的挂载目录下可以重新获取。 - test.txt
 
常见问题
在挂载和使用NAS存储卷的过程中,如果遇到问题,可参考以下文档进行排查。
相关文档
通过CNFS可以实现对NAS文件系统的独立管理,提升NAS文件系统的性能和QoS控制。具体操作,请参见通过CNFS管理NAS文件系统(推荐)。