使用NAS静态存储卷
阿里云Kubernetes CSI支持两种类型的NAS动态存储卷挂载:subpath方式和filesystem方式。本文介绍如何使用阿里云NAS静态存储卷,及如何实现持久化存储与共享存储。
前提条件
使用场景
对磁盘I/O要求较高的应用。
读写性能相对于对象存储OSS高。
可实现跨主机文件共享,例如可作为文件服务器。
注意事项
NAS支持同时被多个Pod挂载,此时多个Pod可能同时修改相同数据,需要应用自行实现数据的同步。
说明NAS存储的/目录不支持修改权限、属主和属组。
目前不支持在应用模板中配置securityContext.fsgroup参数,可能会造成挂载失败。
通过控制台的方式使用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工具连接集群。
同之前的步骤一:获取ACS集群的地域和可用区信息。
同之前的步骤二:创建NAS文件系统和挂载点。
创建静态PVC。
保存以下示例YAML内容至pvc-nas.yaml文件中。
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: pvc-nas annotations: csi.alibabacloud.com/mountpoint: ****.nas.aliyuncs.com spec: accessModes: - ReadWriteMany resources: requests: storage: 20Gi storageClassName: alicloud-nas
参数
说明
name
PVC的名称。
metadata.annotations.csi.alibabacloud.com/mountpoint
挂载点地址,用于关联之前创建的NAS文件系统。
重要如果填写的是****.nas.aliyuncs.com,则表示共享的目录为NAS的根目录(/);如果填写的是****.nas.aliyuncs.com:/dir,则表示共享的目录为NAS的/dir目录,如果/dir目录,不存在则会自动新建。
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。