对于共享数据,I/O要求较高的应用场景,可以使用NAS作为持久化存储卷。本文介绍如何为应用静态挂载NAS存储卷,并验证NAS的共享存储和持久化存储。
背景信息
NAS是一种可共享访问、弹性扩展、高可靠以及高性能的分布式文件系统,适用于共享数据,以及I/O要求较高的应用场景。更多信息,请参见存储概述。
ACS支持静态和动态挂载NAS存储卷。本文介绍静态挂载方式,动态挂载方式请参见动态挂载NAS存储卷。
前提条件
ACS集群中已安装managed-csiprovisioner组件。
您可以在ACS集群管理页的左侧导航栏选择
,在存储页签下查看managed-csiprovisioner组件的安装情况。使用限制
不支持挂载SMB协议的NAS文件系统。
NAS文件系统只能挂载到相同VPC的Pod上,不支持跨VPC挂载。
仅支持通过NFSv3协议挂载NAS文件系统。
注意事项
NAS为共享存储,一个NAS存储卷可以挂载到多个Pod上。此时多个Pod可能同时修改相同数据,需要应用自行实现数据的同步。
挂载NAS时,请勿在应用的YAML中配置
securityContext.fsgroup
,这可能会造成挂载失败。说明NAS文件系统的
/
目录不支持修改权限、属主和属组。挂载NAS后,请勿删除挂载点,否则会造成操作系统无响应。
创建NAS文件系统和挂载点
NAS挂载点所属VPC必须与ACS集群中Pod所属VPC一致,否则会导致挂载失败。如果在Pod使用的VPC和交换机下,您已有NAS文件系统和挂载点,可跳过该步骤。
获取Pod使用的VPC和交换机ID。
说明以下步骤为控制台操作,您也可以执行
kubectl get cm -n kube-system acs-profile -o yaml
命令查看acs-profile的YAML,在vpcId
和vSwitchIds
中获取Pod使用的VPC ID和交换机ID。登录容器计算服务控制台。
在集群页面,单击目标集群ID,进入该集群的管理页面。
在左侧导航栏,选择
。在配置项页面上方将命名空间改为kube-system,然后找到acs-profile,单击YAML 编辑。
在
vpcId
和vSwitchIds
中获取Pod使用的VPC ID和交换机ID。
创建NAS文件系统和挂载点。
登录NAS文件系统控制台。
创建文件系统。
在文件系统列表页面,单击创建文件系统,然后选择创建通用型NAS或创建极速型NAS。
在弹出面板完成NAS相关参数配置,然后单击立即购买,并完成后续操作。
本文以通用型NAS为例,需要注意的参数如下,更多信息,请参见创建文件系统。
参数
说明
地域
与ACS集群一致。
可用区
根据步骤1所获取的Pod使用的交换机ID,选择对应的可用区。
协议类型
选择NFS。目前不支持挂载SMB协议的NAS文件系统。
专有网络VPC、虚拟交换机
选择ACS集群中Pod使用的VPC和交换机。可根据步骤1所获取的VPC ID和交换机ID在专有网络控制台查询。
查看挂载点,并获取挂载点地址。
说明通用型NAS在创建文件系统时会自动创建一个挂载点,极速型NAS需要手动创建挂载点。具体操作,请参见管理挂载点。
在文件系统列表页面,单击文件系统ID。
在文件系统详情页左侧导航栏,单击挂载使用。
在挂载点区域,确认已有挂载点,且挂载点的状态为可用。
静态挂载NAS存储卷
通过kubectl命令
步骤一:创建PVC
连接集群。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群或在CloudShell上通过kubectl管理Kubernetes集群。
将以下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
相关参数说明如下:
参数
说明
csi.alibabacloud.com/mountpoint
要挂载的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
使用以下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
通过控制台
步骤一:创建PVC
登录容器计算服务控制台。
在集群页面,单击目标集群ID,进入该集群的管理页面。
在集群管理页面的左侧导航栏,选择
。在存储声明页面,单击创建。
在弹出的对话框中,完成参数配置,然后单击创建。
参数
说明
示例
存储声明类型
选择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
在集群管理页面的左侧导航栏,选择
。在无状态页面,单击使用镜像创建。
完成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的共享存储和持久化存储
按照上文示例创建的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