对于共享数据,磁盘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存储卷
步骤一:创建StorageClass
连接集群。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群或在CloudShell上通过kubectl管理Kubernetes集群。
参考参数说明表修改以下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所使用的交换机,选择对应的可用区。
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
返回示例如下,PV已关联自动创建的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