本文介绍如何在容器计算服务(ACS)中挂载NAS文件系统,并验证NAS的共享存储和持久化存储。
应用场景
NAS是一种可共享访问、弹性扩展、高可靠以及高性能的分布式文件系统,适用于共享数据,以及I/O要求较高的应用场景。您可以结合NAS费用、性能等选择合适的NAS类型和存储规格。更多信息,请参见通用型NAS、极速型NAS和选型指导。
通用型NAS与极速型NAS在挂载连通性、文件系统数量及协议类型等方面存在相应约束条件。更多信息,请参见使用限制。
根据是否已有NAS文件系统,您可以选择以下方式挂载使用NAS存储卷:
- 如果您已有可用的NAS文件系统,可直接挂载,共享使用。具体操作,请参见使用已有NAS文件系统作为存储卷。 
- 如果您没有可用的NAS文件系统,可通过StorageClass自动创建,并挂载使用。具体操作,请参见新建NAS文件系统作为存储卷。 
前提条件
ACS集群中已安装csi-provisioner组件。
您可以在ACS集群管理页的左侧导航栏单击组件管理,然后在存储页签下确认csi-provisioner组件的安装情况。
使用限制
- 不支持挂载SMB协议的NAS文件系统。 
- NAS文件系统只能挂载到相同VPC的Pod上,不支持跨VPC挂载。 说明- 同一VPC下,NAS可以跨可用区挂载。 
- 仅支持通过NFSv3协议挂载NAS文件系统。 
注意事项
- NAS为共享存储,一个NAS存储卷可以挂载到多个Pod上。此时多个Pod可能同时修改相同数据,需要应用自行实现数据的同步。 
- 挂载NAS时,请勿在应用的YAML中配置 - securityContext.fsgroup,这可能会造成挂载失败。说明- NAS文件系统的 - /目录不支持修改权限、属主和属组。
- 挂载NAS后,请勿删除挂载点,否则会造成操作系统无响应。 
使用已有NAS文件系统作为存储卷
步骤一:获取NAS文件系统信息
- 获取ACS Pod使用的VPC和交换机ID。 说明- 以下步骤为控制台操作,您也可以执行 - kubectl get cm -n kube-system acs-profile -o yaml命令查看acs-profile的YAML,在- vpcId和- vSwitchIds中获取Pod使用的VPC ID和交换机ID。- 登录容器计算服务控制台。 
- 在集群列表页面,单击目标集群名称,进入该集群的管理页面。 
- 在左侧导航栏,选择。 
- 在配置项页面上方将命名空间改为kube-system,然后找到acs-profile,单击YAML 编辑。 
- 在 - vpcId和- vSwitchIds中获取Pod使用的VPC ID和交换机ID。
 
- 确认已有的NAS文件系统满足要求,并获取挂载点地址。 - 登录NAS文件系统控制台,在左侧导航栏,单击文件系统列表。 
- 找到目标NAS文件系统,确认地域、可用区和协议类型满足要求。 - NAS不支持跨VPC挂载,即不支持跨地域使用。请确保已有NAS的所属地域与ACS一致。 
- 同一VPC下,NAS可以跨可用区挂载,但建议和ACS集群中Pod使用的可用区一致,性能相对更优。 
- 确认NAS文件系统的协议类型为NFS。目前不支持挂载SMB协议的NAS文件系统。 
  
- 确认挂载点满足要求,并获取挂载点地址。 - 单击文件系统ID。 
- 在文件系统详情页左侧导航栏,单击挂载使用。 
- 在挂载点区域,确认已有挂载点满足要求,然后获取挂载点地址。 说明- 通用型NAS在创建文件系统时会自动创建一个挂载点,极速型NAS需要手动创建挂载点。 
- 如果已有挂载点不满足要求,可创建新的挂载点。具体操作,请参见管理挂载点。 
 - 挂载点的VPC必须和ACS集群中Pod使用的VPC一致,否则会导致挂载失败。 
- 挂载点的交换机建议和ACS集群中Pod使用的交换机一致,性能相对更优。 
- 挂载点的状态为可用。 
  
 
 
步骤二:创建PVC
kubectll
- 将以下YAML内容保存为nas-pvc.yaml。 - kind: PersistentVolumeClaim apiVersion: v1 metadata: name: nas-pvc annotations: csi.alibabacloud.com/mountpoint: *******-mw***.cn-shanghai.nas.aliyuncs.com csi.alibabacloud.com/mount-options: nolock,tcp,noresvport spec: accessModes: - ReadWriteMany resources: requests: storage: 20Gi storageClassName: alibaba-cloud-nas- 相关参数说明如下: 重要- 根据上述YAML创建PVC时,系统会根据 - annotations中关于NAS的配置先创建静态PV,然后再创建PVC,关联该PV。- 参数 - 说明 - csi.alibabacloud.com/mountpoint- 要挂载的NAS文件系统目录。用于关联之前创建的NAS文件系统。 - 如果输入挂载点地址,例如 - ****-****.<region>.nas.aliyuncs.com,则表示挂载的目录为NAS文件系统的根目录(- /)。
- 如果输入挂载点地址和子目录,例如 - ****-****.<region>.nas.aliyuncs.com:/dir,则表示挂载的目录为NAS文件系统的- /dir目录。如果- /dir目录不存在,系统会自动新建。
 - csi.alibabacloud.com/mount-options- 挂载参数。建议使用 - nolock,tcp,noresvport。- accessModes- 访问模式。 - storage- 分配给Pod的存储容量,即要创建的NAS存储卷容量。 
- 创建PVC。 - kubectl create -f nas-pvc.yaml
- 查看PV。 - kubectl get pv- 预期返回如下,在创建PVC时已基于传入的NAS文件系统挂载点等信息,自动创建对应的PV。 - NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE nas-ea7a0b6a-bec2-4e56-b767-47222d3a**** 20Gi RWX Retain Bound default/nas-pvc alibaba-cloud-nas 1m58s
- 查看PVC。 - kubectl get pvc- 预期返回如下,PVC已关联自动创建的PV。 - NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE nas-pvc Bound nas-ea7a0b6a-bec2-4e56-b767-47222d3a**** 20Gi RWX alibaba-cloud-nas <unset> 2m14s
控制台
- 登录容器计算服务控制台。 
- 在集群列表页面,单击目标集群名称,进入该集群的管理页面。 
- 在集群管理页面的左侧导航栏,选择。 
- 在存储声明页面,单击创建。 
- 在弹出的对话框中,完成参数配置,然后单击创建。 - 参数 - 说明 - 示例 - 存储声明类型 - 选择NAS。 - NAS - 名称 - PVC名称,自定义输入。格式要求请参考界面提示。 - nas-pvc - 分配模式 - 选择使用挂载点域名创建。 - 使用挂载点域名创建 - 存储驱动 - 默认已选择CSI。 - CSI - 总量 - 分配给Pod的存储容量,即要创建的NAS存储卷容量。 - 20Gi - 访问模式 - 支持ReadWriteMany和ReadWriteOnce。 - ReadWriteMany - 挂载点域名 - 配置要挂载的NAS文件系统目录。 - 如果输入挂载点地址,例如 - ****-****.<region>.nas.aliyuncs.com,则表示挂载的目录为NAS文件系统的根目录(- /)。
- 如果输入挂载点地址和子目录,例如 - ****-****.<region>.nas.aliyuncs.com:/dir,则表示挂载的目录为NAS文件系统的- /dir目录。如果- /dir目录不存在,系统会自动新建。
 - 350514****-mw***.cn-shanghai.nas.aliyuncs.com - 创建完成后,在存储声明页面可以看到新创建的PVC,该PVC已绑定自动创建的PV(即NAS存储卷)。您可以在存储卷页面查看对应PV的详细信息。   
步骤三:创建应用并挂载NAS
kubectll
- 使用以下YAML内容,创建nas-test.yaml文件。 - 以下YAML示例可以创建包含2个Pod的Deployment,2个Pod均通过名为 - nas-pvc的PVC申请存储资源,挂载路径均为- /data。- 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: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest ports: - containerPort: 80 volumeMounts: - name: pvc-nas mountPath: /data volumes: - name: pvc-nas persistentVolumeClaim: claimName: nas-pvc
- 创建Deployment并挂载NAS。 - kubectl create -f nas-test.yaml
- 查看Deployment中Pod的部署情况。 - kubectl get pod | grep nas-test- 返回示例如下,已创建2个Pod。 - nas-test-****-***a 1/1 Running 0 40s nas-test-****-***b 1/1 Running 0 40s
- 查看挂载路径。 - 命令示例如下,预期会返回NAS文件系统挂载目录下的数据。默认为空。 - kubectl exec nas-test-****-***a -- ls /data
控制台
- 在集群管理页面的左侧导航栏,选择。 
- 在无状态页面,单击使用镜像创建。 
- 完成Deployment的参数配置,单击创建。 - 需要注意的参数如下,其他参数保持默认即可。更多信息,请参见创建无状态工作负载Deployment。 - 配置页 - 参数 - 说明 - 示例 - 应用基本信息 - 应用名称 - Deployment名称,自定义输入。格式要求请参考界面提示。 - nas-test - 副本数量 - 配置Deployment的副本数量。 - 2 - 容器配置 - 镜像名称 - 输入用于部署应用的镜像地址。 - registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest - 所需资源 - 设置所需的vCPU和内存资源。 - 0.25 vCPU,0.5 GiB - 数据卷 - 单击增加云存储声明,然后完成参数配置。 - 挂载源:选择之前创建的PVC。 
- 容器路径:输入NAS文件系统要挂载到的容器路径。 
 - 挂载源:nas-pvc 
- 容器路径:/data 
 
- 查看应用部署情况。 - 在无状态页面,单击应用名称。 
- 在容器组页签下,确认Pod已正常运行(状态为Running)。 
 
新建NAS文件系统作为存储卷
步骤一:创建StorageClass
- 参考参数说明表修改以下YAML内容,并保存为nas-sc.yaml。 - apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: alicloud-nas-fs mountOptions: - nolock,tcp,noresvport - vers=3 parameters: volumeAs: filesystem fileSystemType: standard storageType: Performance regionId: cn-shanghai zoneId: cn-shanghai-e vpcId: "vpc-2ze2fxn6popm8c2mzm****" vSwitchId: "vsw-2zwdg25a2b4y5juy****" accessGroupName: DEFAULT_VPC_GROUP_NAME deleteVolume: "false" provisioner: nasplugin.csi.alibabacloud.com reclaimPolicy: Retain- 相关参数说明如下: 重要- 不同类型和存储规格的NAS文件系统支持的地域、可用区不同。请根据业务的存储需求、ACS集群所属地域和ACS集群中Pod使用的VPC和交换机信息等确定您要在哪个地域、可用区,以及哪个VPC、交换机下创建什么类型的NAS文件系统和挂载点。相关参考如下: - 参数 - 说明 - volumeAs- 目前仅支持 - filesystem,表示会自动创建一个NAS文件系统,即一个NAS存储卷对应一个NAS文件系统。- fileSystemType- NAS文件系统的类型。 - storageType- NAS文件系统的存储规格。 - 对于通用型NAS,可选值如下: - Performance(默认):性能型
- Capacity:容量型
 
- 对于极速型NAS,可选值如下: - standard(默认):标准型
- advanced:高级型
 
 - regionId- NAS文件系统所属地域。需与ACS集群所属地域保持一致。 - zoneId- NAS文件系统所属可用区。请根据ACS集群中Pod所使用的交换机,选择对应的可用区。 说明- 同一VPC下,NAS可以跨可用区挂载。建议选择同一可用区,性能相对更优。 - vpcId、- vSwitchId- NAS文件系统挂载点所属的VPC ID和交换机ID。需配置为ACS集群中Pod使用的VPC ID和交换机ID。 - accessGroupName- NAS文件系统挂载点的权限组。默认为 - DEFAULT_VPC_GROUP_NAME。- provisioner- 驱动类型。必须配置为 - nasplugin.csi.alibabacloud.com,表示使用阿里云NAS CSI插件。- reclaimPolicy- PV的回收策略。目前仅支持 - Retain,表示删除PV时,会保留对应的NAS文件系统和挂载点。
- 创建StorageClass。 - kubectl create -f nas-sc.yaml
- 查看StorageClass。 - kubectl get sc- 预期返回: - NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE alicloud-nas-fs nasplugin.csi.alibabacloud.com Retain Immediate false 13m ......
步骤二:创建PVC
- 将以下YAML内容保存为nas-pvc-fs.yaml。 - kind: PersistentVolumeClaim apiVersion: v1 metadata: name: nas-pvc-fs spec: accessModes: - ReadWriteMany storageClassName: alicloud-nas-fs resources: requests: storage: 20Gi- 相关参数说明如下: - 参数 - 说明 - accessModes- 访问模式。 - storage- 分配给Pod的存储容量,即要创建的NAS存储卷容量。 说明- 由于极速型NAS有100 GiB的最小容量限制,如果StorageClass中定义的NAS文件系统类型为极速型NAS,此处 - storage的值必须≥100 GiB,否则无法创建对应的PV。- storageClassName- 要绑定的StorageClass名称。 
- 创建PVC。 - kubectl create -f nas-pvc-fs.yaml
- 查看PVC。 - kubectl get pvc- 返回示例如下,PVC已关联自动创建的PV。您可以前往NAS文件系统控制台查看对应的NAS文件系统。 - NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE nas-pvc-fs Bound nas-04a730ba-010d-4fb1-9043-476d8c38**** 20Gi RWX alicloud-nas-fs <unset> 14s
步骤三:创建应用并挂载NAS
- 使用以下YAML内容,创建nas-test-fs.yaml文件。 - 以下YAML示例可以创建包含2个Pod的Deployment,2个Pod均通过名为 - nas-pvc-fs的PVC申请存储资源,挂载路径均为- /data。- 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: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest ports: - containerPort: 80 volumeMounts: - name: pvc-nas mountPath: /data volumes: - name: pvc-nas persistentVolumeClaim: claimName: nas-pvc-fs
- 创建Deployment并挂载NAS。 - kubectl create -f nas-test-fs.yaml
- 查看Deployment中Pod的部署情况。 - kubectl get pod | grep nas-test- 返回示例如下,已创建2个Pod。 - nas-test-****-***a 1/1 Running 0 40s nas-test-****-***b 1/1 Running 0 40s
- 查看挂载路径。 - 命令示例如下,预期会返回NAS文件系统挂载目录下的数据。默认为空。 - kubectl exec nas-test-****-***a -- ls /data
验证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