对于共享数据,I/O要求较高的应用场景,可以使用NAS文件系统作为持久化存储卷。本文介绍如何为应用挂载NAS存储卷,并验证NAS的共享存储和持久化存储。
背景信息
NAS是一种可共享访问、弹性扩展、高可靠以及高性能的分布式文件系统,适用于共享数据,以及I/O要求较高的应用场景。更多信息,请参见存储概述。
根据是否已有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使用的交换机一致,性能相对更优。
挂载点的状态为可用。

步骤二:创建StorageClass
参考参数说明表修改以下YAML内容,并保存为nas-sc.yaml。
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: alicloud-nas-subpath mountOptions: - nolock,tcp,noresvport - vers=3 parameters: volumeAs: subpath server: *******-mw***.cn-shanghai.nas.aliyuncs.com path: "/csi" provisioner: nasplugin.csi.alibabacloud.com reclaimPolicy: Retain相关参数说明:
参数
说明
volumeAs挂载方式。本示例设置为
subpath,表示创建子目录类型的PV。一个PV对应一个NAS文件系统的子目录。serverNAS文件系统的挂载点地址。
path要挂载的NAS子目录。
如果未设置,则默认挂载到根目录。
如果NAS中没有该目录,会自动创建后再进行挂载。
通用型NAS的根目录为
/,极速型NAS的根目录为/share。挂载极速型NAS的子目录时,path必须以/share开头,如/share/data。provisioner驱动类型。必须配置为
nasplugin.csi.alibabacloud.com,表示使用阿里云NAS CSI插件。reclaimPolicyPV的回收策略。目前仅支持
Retain,表示删除PV时,会保留对应的NAS文件系统和挂载点。
步骤三:创建PVC
kubectl
将以下YAML内容保存为nas-pvc.yaml。
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: nas-pvc annotations: spec: accessModes: - ReadWriteMany resources: requests: storage: 20Gi storageClassName: alicloud-nas-subpath相关参数说明:
参数
说明
accessModes访问模式。
storage分配给Pod的存储容量,即要创建的NAS存储卷容量。
storageClassName要绑定的StorageClass的名称。
创建PVC。
kubectl create -f nas-pvc.yaml查看PV。
kubectl get pv预期返回如下,可以看到 CSI 已基于 StorageClass 自动创建了 PV,并绑定到 PVC。
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE nas-ea7a0b6a-bec2-4e56-b767-47222d3a**** 20Gi RWX Retain Bound default/nas-pvc alicloud-nas-subpath 1m58s
控制台
登录容器计算服务控制台。
在集群列表页面,单击目标集群名称,进入该集群的管理页面。
在集群管理页面的左侧导航栏,选择。
在存储声明页面,单击创建。
在弹出的对话框中,完成参数配置,然后单击创建。
参数
说明
示例
存储声明类型
选择NAS。
NAS
名称
PVC名称,自定义输入。格式要求请参考界面提示。
nas-pvc
分配模式
选择使用存储类动态创建。
使用存储类动态创建
总量
分配给Pod的存储容量,即要创建的NAS存储卷容量。
20Gi
访问模式
支持ReadWriteMany和ReadWriteOnce。
ReadWriteMany
创建完成后,在存储声明页面可以看到新创建的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查看挂载路径。
kubectl exec nas-test-****-***a -- df -h /data预期输出:
Filesystem Size Used Avail Use% Mounted on 350514*****-mw***.cn-shanghai.nas.aliyuncs.com:/ 10P 0 10P 0% /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文件系统。fileSystemTypeNAS文件系统的类型。
storageTypeNAS文件系统的存储规格。
对于通用型NAS,可选值如下:
Performance(默认):性能型Capacity:容量型
对于极速型NAS,可选值如下:
standard(默认):标准型advanced:高级型
regionIdNAS文件系统所属地域。需与ACS集群所属地域保持一致。
zoneIdNAS文件系统所属可用区。请根据ACS集群中Pod所使用的交换机,选择对应的可用区。
说明同一VPC下,NAS可以跨可用区挂载。建议选择同一可用区,性能相对更优。
vpcId、vSwitchIdNAS文件系统挂载点所属的VPC ID和交换机ID。需配置为ACS集群中Pod使用的VPC ID和交换机ID。
accessGroupNameNAS文件系统挂载点的权限组。默认为
DEFAULT_VPC_GROUP_NAME。provisioner驱动类型。必须配置为
nasplugin.csi.alibabacloud.com,表示使用阿里云NAS CSI插件。reclaimPolicyPV的回收策略。目前仅支持
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查看挂载路径。
kubectl exec nas-test-****-***a -- df -h /data预期输出:
Filesystem Size Used Avail Use% Mounted on 350514*****-mw***.cn-shanghai.nas.aliyuncs.com:/ 10P 0 10P 0% /data如果输出类似信息,则表示挂载文件系统成功。
通过NFS Volume方式挂载已有NAS文件系统
步骤一:获取NAS文件系统信息
请参考获取NAS文件系统信息,获取NAS挂载点地址。
步骤二:创建应用并挂载NAS
使用以下YAML内容,创建
nas-test-nfs.yaml文件。以下YAML示例可以创建包含2个Pod的Deployment,2个Pod均通过名为
nfs-nas的volume将NAS文件系统挂载至/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: nfs-nas mountPath: /data volumes: - name: nfs-nas nfs: server: file-system-id.region.nas.aliyuncs.com # 阿里云NAS文件系统挂载点地址,请根据实际值替换。例如,7bexxxxxx-xxxx.ap-southeast-1.nas.aliyuncs.com。 path: / # NAS文件系统目录路径。该目录必须为已经存在的目录或根目录。通用型NAS的根目录为“/”,极速型NAS的根目录为“/share”。创建Deployment并挂载NAS。
kubectl create -f nas-test-nfs.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查看挂载路径。
kubectl exec nas-test-****-***a -- df -h /data预期输出:
Filesystem Size Used Avail Use% Mounted on 350514*****-mw***.cn-shanghai.nas.aliyuncs.com:/ 10P 0 10P 0% /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