NAS存储卷是一种可共享访问、弹性扩展、高可靠以及高性能的分布式文件系统。本文介绍如何使用阿里云NAS静态存储卷,以及如何实现持久化存储与共享存储。
前提条件
使用场景
适用于对磁盘I/O要求较高的应用。
选用持久化数据存储时,NAS读写性能相对于对象存储OSS高。
可作为文件服务器实现跨主机文件共享。
注意事项
NAS支持同时被多个Pod挂载,此时多个Pod可能同时修改相同数据,需要应用自行实现数据的同步。
说明NAS存储的
/
目录不支持修改权限、属主和属组。目前不支持在应用模板中配置
securityContext.fsgroup
参数,可能会造成挂载失败。目前使用NAS动态卷时,仅支持以filesystem的方式使用,共享目录为NAS的根目录(
/
)。CSI插件不支持SMB挂载。
数据卷挂载协议推荐使用NFSv3。
NAS卷只能挂载到相同VPC的ECS实例,不支持不同VPC网络的挂载。
通用NAS与极速NAS在挂载连通性、文件系统数量及协议类型等方面存在相应约束条件。更多信息,请参见使用限制。
使用NAS数据卷前,建议将CSI存储插件升级到最新版本。
NAS挂载点创建后,等待一定时间,待挂载点状态为可用后方可使用。
在没有卸载NAS文件系统前,务必不要删除NAS挂载点,否则会造成操作系统无响应。
不同方式创建NAS静态存储卷
通过控制台的方式创建NAS静态存储卷
步骤一:获取ACS集群的地域和可用区信息
登录容器计算服务控制台,在左侧导航栏选择集群。
在集群列表页面,选择目标集群。
在集群管理页左侧导航栏,选择集群信息。
在集群信息页面,单击集群资源标签。
记录ACS集群的“虚拟专有网络 VPC”和“Pod 虚拟交换机”信息,并且分别点击查看它们的详情,记录下它们的ID和名称,以及地域和可用区信息。
步骤二:创建NAS文件系统和挂载点
登录NAS文件系统控制台。
点击页面下方“创建通用型NAS”的按钮。
配置创建通用型NAS的各个选项,其中:
地域与ACS集群的地域保持一致;
可用区建议与步骤一中的ACS集群所在可用区保持一致;
存储规格根据您的自身需求选择即可;
协议类型选择NFS;
专有网络选择与ACS集群一致的VPC。注意这里选择的是专有网络的名称,而非ID;
虚拟交换机建议选择位于上述可用区的交换机。这里选择的同样是虚拟交换机的名称,而非ID;
创建NAS文件系统后,在集群管理页左侧导航栏,选择文件系统 > 文件系统列表,点击刚才自己创建的文件系统查看详情。
在文件系统详情页左侧导航栏,选择挂载使用,点击添加挂载点按钮查看挂载点,等待其状态变为可用。
如果要创建极速型NAS,则需要先创建文件系统,然后进入文件系统添加挂载点。关于专有网络和虚拟交换机等参数选择请同样遵循上述说明。
步骤三:创建PVC
登录容器计算服务控制台,在左侧导航栏选择集群。
在集群列表页面,选择目标集群。
在集群管理页左侧导航栏,选择存储 > 存储声明。
在存储声明页面,单击右上角的创建。
在弹出的创建存储声明页面中,填写界面参数。
参数
说明
存储声明类型
支持云盘和NAS两种云存储类型。 本文中选择NAS。
名称
创建的存储声明名称在集群内必须唯一。
分配模式
选择使用挂载点域名创建。
总量
所创建存储卷的容量。
说明所创建存储卷声明的容量不能超过待挂载的存储卷容量。
挂载点域名
填写步骤二中获取的挂载点域名,默认共享目录为NAS的根目录(
/
)。重要如果希望共享subpath子目录,或步骤二中创建的是极速型NAS,则需要通过kubectl命令行的方式完成。
极速型NAS的共享目录必须以
/share
开头,例如:/share
、/share/subdir
。
单击创建。
创建成功后可以在列表中看到创建的存储声明,状态为Pending,等待Pod消费。
步骤四:创建应用
在集群管理页左侧导航栏,选择工作负载 > 无状态。
在无状态页面,单击使用镜像创建。
配置创建应用的参数信息。
以下主要为您介绍数据卷的配置。关于其他参数的描述,请参见创建无状态工作负载Deployment。
ACS数据卷支持配置本地存储和云存储。
本地存储:支持配置项(ConfigMap)、保密字典(Secret)和临时目录(EmptyDir),将对应的挂载源挂载到容器路径中。更多信息,请参见Volumes。
云存储:支持云存储类型。
本例中配置了一个NAS类型的数据卷,将该NAS存储卷挂载到容器中
/tmp
路径下。所有的信息都配置完成后,单击创建。
创建成功后,就可以正常使用数据卷了。
通过kubectl命令行方式创建NAS静态存储卷
前提条件:已使用kubectl连接Kubernetes集群。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群。
步骤一:创建静态PVC。
保存以下示例YAML内容至pvc-nas.yaml文件中。
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: pvc-nas annotations: csi.alibabacloud.com/mountpoint: ****.nas.aliyuncs.com csi.alibabacloud.com/mount-options: nolock,tcp,noresvport spec: accessModes: - ReadWriteMany resources: requests: storage: 20Gi storageClassName: alibaba-cloud-nas
参数
说明
name
PVC的名称。
metadata.annotations.csi.alibabacloud.com/mountpoint
挂载点地址,用于关联之前创建的NAS文件系统。
重要如果填写的是****.nas.aliyuncs.com,则表示共享的目录为NAS的根目录(
/
);如果填写的是****.nas.aliyuncs.com:/dir,则表示共享的目录为NAS的/dir
目录,/dir
目录不存在会自动新建。metadata.annotations.csi.alibabacloud.com/mount-options
挂载参数, 默认为空。
accessModes
配置访问模式。
storage
声明应用使用量,不能大于存储卷的总量。
执行以下命令创建静态PVC。
kubectl create -f pvc-nas.yaml
步骤二:创建名为nas-static的应用,并挂载PVC。
以下为创建nas-static应用的nas.yaml示例文件。
apiVersion: apps/v1 kind: Deployment metadata: name: nas-static labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80 volumeMounts: - name: pvc-nas mountPath: "/data" volumes: - name: pvc-nas persistentVolumeClaim: claimName: pvc-nas
参数
说明
mountPath
NAS在容器中挂载的位置。
claimName
PVC的名称,用于绑定PVC。
执行以下命令创建名为nas-static的应用,并挂载PVC。
kubectl create -f nas.yaml
执行以下命令,查看Pod信息。
kubectl get pod
预期输出:
NAME READY STATUS RESTARTS AGE nas-static-785b747ddf-q**** 1/1 Running 0 32s nas-static-785b747ddf-z**** 1/1 Running 0 32s
验证NAS的持久化存储
查看部署应用和NAS文件。
执行以下命令,查看部署的应用名称。
kubectl get pod
预期输出:
NAME READY STATUS RESTARTS AGE nas-static-785b747ddf-q**** 1/1 Running 0 32s nas-static-785b747ddf-z**** 1/1 Running 0 32s
执行以下命令,查看任意一个应用的
/data
路径下的文件,本文以名为nas-static-785b747ddf-q****
的Pod为例。kubectl exec nas-static-785b747ddf-q**** -- ls /data
无返回结果,说明
/data
路径下无文件。
执行以下命令,在名为
nas-static-785b747ddf-q****
Pod的/data
路径下创建文件nas
。kubectl exec nas-static-785b747ddf-q**** -- touch /data/nas
执行以下命令,查看名为
nas-static-5b5cdb85f6-n****
Pod的/data
路径下的文件。kubectl exec nas-static-785b747ddf-q**** -- ls /data
预期输出:
nas
执行以下命令,删除Pod。
kubectl delete pod nas-static-785b747ddf-q****
同时在另一个窗口中,执行以下命令,查看Pod删除及Kubernetes重建Pod的过程。
kubectl get pod -w -l app=nas-static
验证删除Pod后,NAS里创建的文件是否还存在。
执行以下命令,查看Kubernetes重建的Pod名称。
kubectl get pod
预期输出:
NAME READY STATUS RESTARTS AGE nas-static-785b747ddf-6**** 1/1 Running 0 25s nas-static-785b747ddf-z**** 1/1 Running 0 2m
执行以下命令,查看名为
nas-static-785b747ddf-6****
的Pod/data
路径下的文件。kubectl exec nas-static-785b747ddf-6**** -- ls /data
预期输出:
nas
nas
文件仍然存在,说明NAS的数据可以持久化保存。
验证NAS的共享存储
查看部署的应用所在的Pod和NAS文件。
执行以下命令,查看应用所在Pod的名称。
kubectl get pod
预期输出:
NAME READY STATUS RESTARTS AGE nas-static-785b747ddf-6**** 1/1 Running 0 25s nas-static-785b747ddf-z**** 1/1 Running 0 2m
执行以下命令,查看2个Pod
/data
路径下的文件。kubectl exec nas-static-785b747ddf-6**** -- ls /data kubectl exec nas-static-785b747ddf-z**** -- ls /data
执行以下命令,在任意一个Pod的
/data
路径下创建文件nas
。kubectl exec nas-static-785b747ddf-6**** -- touch /data/nas
执行以下命令,查看2个Pod
/data
路径下的文件。执行以下命令,查看名为
nas-static-785b747ddf-6****
的Pod/data
路径下的文件。kubectl exec nas-static-785b747ddf-6**** -- ls /data
预期输出:
nas
执行以下命令,查看名为
nas-static-785b747ddf-z****
的Pod/data
路径下的文件。kubectl exec nas-static-785b747ddf-z**** -- ls /data
预期输出:
nas
如果在任意一个Pod的
/data
下创建的文件,两个Pod下的/data
路径下均存在此文件,则说明两个Pod共享一个NAS。
- 本页导读