NAS是一种可共享访问、弹性扩展、高可靠以及高性能的分布式文件系统。本文介绍如何使用阿里云NAS静态存储卷,及如何实现持久化存储与共享存储。
前提条件
已创建Kubernetes集群。具体操作,请参见创建ACK托管集群。
已创建NAS文件系统。具体操作,请参见创建文件系统。
若需要加密NAS存储卷中的数据,请在创建NAS文件系统时配置加密类型。
已创建NAS挂载点。具体操作,请参见管理挂载点。
NAS挂载点需要和集群节点在同一个VPC内。
已使用kubectl连接Kubernetes集群。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群。
使用场景
对磁盘I/O要求较高的应用。
读写性能相对于对象存储OSS高。
可实现跨主机文件共享,例如可作为文件服务器。
注意事项
在使用极速NAS文件系统时,配置数据卷的
path
需要以/share为父目录。例如,Pod挂载的NAS文件系统子目录可配置为/share/path1。NAS为共享存储,可以同时为多个Pod提供共享存储服务,即一个PVC可以同时被多个应用使用。关于NAS并发写入的一些限制条件,请参见如何避免多进程或多客户端并发写同一日志文件可能出现的异常?和如何解决向NFS文件系统中写入数据延迟问题?
NAS静态存储卷不支持扩容。
若您在应用模板中配置了securityContext.fsgroup参数,kubelet在存储卷挂载完成后会执行
chmod
或chown
操作,导致挂载时间延长。说明若已配置securityContext.fsgroup参数,且需要减少挂载时间。具体操作,请参见NAS存储卷挂载时间延长。
使用NAS静态存储卷
您可以通过控制台和kubectl命令行两种方式进行挂载。
通过控制台方式使用
步骤一:创建PV
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在存储卷页面,单击右上角的创建。
在创建存储卷对话框中配置参数。
配置项
说明
存储卷类型
支持云盘、NAS、OSS三种云存储类型。本文中选择为NAS。
名称
创建的数据卷的名称。数据卷名在集群内必须唯一。本例为pv-nas。
总量
所创建存储卷的容量。注意NAS文件系统本身不限制使用量。此处不是NAS文件系统的使用限额,只是所创建存储卷的容量声明。
访问模式
支持ReadWriteMany和ReadWriteOnce。默认为ReadWriteMany。
是否使用CNFS
是否使用CNFS功能。开启后,您需要进行以下操作:
选择对应的CNFS或新建CNFS。关于CNFS的更多信息,请参见创建CNFS管理NAS文件系统(推荐)。
是否开启CNFS加速功能,关于CNFS加速更多信息,请参见开启CNFS NAS计算端分布式缓存。
挂载点域名
您可以通过选择挂载点或者自定义的方式定义集群在NAS文件系统中挂载点的挂载地址。关于如何查看挂载点地址,请参见查看挂载点地址。
显示高级选项
挂载路径:NAS文件系统中的挂载路径。以/为根目录,设定后数据卷将挂载到指定的子目录。
如果NAS根目录下没有此子目录,会默认创建后再挂载。
您可以不填此项,默认挂载到NAS根目录。
极速NAS需要以/share为父目录。
回收策略:默认为Delete,支持Retain。
Delete:需配合
archiveOnDelete
一起使用。当
archiveOnDelete
为true
时,删除PVC时,PV和NAS文件只会被重命名,不会被删除。当
archiveOnDelete
为false
时,删除PVC时,PV和NAS文件会被真正删除。
Retain:删除PVC时,PV和NAS文件系统不会被删除,需要您手动删除。
如果数据安全性要求高,推荐使用Retain,以免误删数据。
挂载选项:挂载NAS的可选参数,包括NFS协议版本等参数。
NFS协议版本号推荐使用v3,且极速类型NAS仅支持v3。关于NFS协议的更多信息,请参见NFS协议。
标签
为该存储卷添加标签。
参数配置完成后,单击创建。
步骤二:创建PVC
在集群管理页左侧导航栏,选择 。
在存储声明页面,单击右上角的创建。
在弹出的创建存储声明页面中,填写界面参数。
参数
说明
存储声明类型
支持云盘、NAS、OSS三种云存储类型。 本文中选择NAS。
名称
创建的存储声明名称在集群内必须唯一。
分配模式
选择已有存储卷。
说明若未创建存储卷,您可以设置分配模式为创建存储卷,配置创建存储卷参数。更多信息,请参见步骤一:创建PV。
已有存储卷
单击选择已有存储卷,在目标存储卷右侧操作列单击选择,选择存储卷。
总量
所创建存储卷的容量。
说明所创建存储卷声明的容量不能超过待挂载的存储卷容量。
访问模式
默认为ReadWriteMany,也可选择ReadWriteOnce或ReadOnlyMany。
配置完成后,单击创建。
创建成功后可以在列表中看到创建的存储声明,并且已绑定相应的存储卷。
步骤三:创建应用
在集群管理页左侧导航栏,选择 。
在无状态页面,单击使用镜像创建。
配置创建应用的参数信息。
本地存储:支持主机目录(HostPath)、配置项(ConfigMap)、保密字典(Secret)和临时目录,将对应的挂载源挂载到容器路径中。更多信息,请参见Volumes。
云存储:支持云存储类型。
配置完成后,单击创建。
以下主要为您介绍数据卷的配置。关于其他参数的描述,请参见创建无状态工作负载Deployment。
ACK数据卷支持配置本地存储和云存储。
本例中配置了一个NAS类型的数据卷,将该NAS存储卷挂载到容器中/tmp路径下。
通过kubectl命令行方式使用
NAS静态存储卷
创建静态PV。
保存以下示例YAML内容至pv-nas.yaml文件中。
apiVersion: v1 kind: PersistentVolume metadata: name: pv-nas labels: alicloud-pvname: pv-nas spec: capacity: storage: 5Gi accessModes: - ReadWriteMany csi: driver: nasplugin.csi.alibabacloud.com volumeHandle: pv-nas # 必须与PV Name保持一致。 volumeAttributes: server: "2564f4****-ysu87.cn-shenzhen.nas.aliyuncs.com" path: "/csi" mountOptions: - nolock,tcp,noresvport - vers=3
参数
说明
name
PV的名称。
labels
设置PV的标签。
storage
NAS的可使用量。
accessModes
配置访问模式。默认为
ReadWriteMany
,支持ReadWriteOnce
或ReadOnlyMany
。driver
驱动类型。本例中取值为
nasplugin.csi.alibabacloud.com
,表示使用阿里云NAS CSI插件。volumeHandle
配置PV的唯一标识符,必须与PV Name保持一致。若需要同时使用多个PV,则各个PV中该值必须不一致。
server
NAS挂载点。
重要需要替换为实际的挂载点地址,如何查看挂载点地址,具体操作,请参见查看挂载点地址。
path
挂载子目录,极速NAS需要以/share为父目录。
vers
挂载NAS数据卷的NFS协议版本号,推荐使用v3,极速类型NAS仅支持v3。关于NFS协议的更多信息,请参见NFS协议。
执行以下命令创建静态PV。
kubectl create -f pv-nas.yaml
创建NAS存储声明PVC,使用selector筛选PV,精确配置PVC和PV的绑定关系。
保存以下示例YAML内容至pvc-nas.yaml文件中。
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: pvc-nas spec: accessModes: - ReadWriteMany resources: requests: storage: 5Gi selector: matchLabels: alicloud-pvname: pv-nas
参数
说明
name
PVC的名称。
accessModes
配置访问模式。默认为
ReadWriteMany
,支持ReadWriteOnce
或ReadOnlyMany
。storage
声明应用使用量,不能大于存储卷的总量。
matchLabels
输入PV的标签,用于关联PV。
执行以下命令创建静态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-5b5cdb85f6-n**** 1/1 Running 0 32s nas-static-c5bb4746c-4**** 1/1 Running 0 32s
验证NAS的持久化存储
查看部署应用和NAS文件。
执行以下命令,查看部署的应用名称。
kubectl get pod
预期输出:
NAME READY STATUS RESTARTS AGE nas-static-5b5cdb85f6-n**** 1/1 Running 0 32s nas-static-c5bb4746c-4**** 1/1 Running 0 32s
执行以下命令,查看任意一个应用的/data路径下的文件,本文以名为
nas-static-5b5cdb85f6-n****
的Pod为例。kubectl exec nas-static-5b5cdb85f6-n**** -- ls /data
无返回结果,说明/data路径下无文件。
执行以下命令,在名为
nas-static-5b5cdb85f6-n****
Pod的/data路径下创建文件nas。kubectl exec nas-static-5b5cdb85f6-n**** -- touch /data/nas
执行以下命令,查看名为
nas-static-5b5cdb85f6-n****
Pod的/data路径下的文件。kubectl exec nas-static-5b5cdb85f6-n**** -- ls /data
预期输出:
nas
执行以下命令,删除Pod。
kubectl delete pod nas-static-5b5cdb85f6-n****
同时在另一个窗口中,执行以下命令,查看Pod删除及Kubernetes重建Pod的过程。
kubectl get pod -w -l app=nginx
验证删除Pod后,NAS里创建的文件是否还存在。
执行以下命令,查看Kubernetes重建的Pod名称。
kubectl get pod
预期输出:
NAME READY STATUS RESTARTS AGE nas-static-5b5cdb85f6-n**** 1/1 Running 0 32s nas-static-c5bb4746c-4**** 1/1 Running 0 32s
执行以下命令,查看名为
nas-static-5b5cdb85f6-n****
的Pod /data路径下的文件。kubectl exec nas-static-5b5cdb85f6-n**** -- ls /data
预期输出:
nas
nas文件仍然存在,说明NAS的数据可持久化保存。
验证NAS的共享存储
查看部署的应用所在的Pod和NAS文件。
执行以下命令,查看应用所在的Pod名称。
kubectl get pod
预期输出:
NAME READY STATUS RESTARTS AGE nas-static-5b5cdb85f6-n**** 1/1 Running 0 32s nas-static-c5bb4746c-4**** 1/1 Running 0 32s
执行以下命令,查看两个Pod /data路径下的文件。
kubectl exec nas-static-5b5cdb85f6-n**** -- ls /data kubectl exec nas-static-c5bb4746c-4**** -- ls /data
执行以下命令,在任意一个Pod /data路径下创建文件nas。
kubectl exec nas-static-5b5cdb85f6-n**** -- touch /data/nas
执行以下命令,查看两个Pod /data路径下的文件。
执行以下命令,查看名为
nas-static-5b5cdb85f6-n****
的Pod /data路径下的文件。kubectl exec nas-static-5b5cdb85f6-n**** -- ls /data
预期输出:
nas
执行以下命令,查看名为
nas-static-c5bb4746c-4****
的Pod /data路径下的文件。kubectl exec nas-static-c5bb4746c-4**** -- ls /data
预期输出:
nas
如果在任意一个Pod的/data下创建的文件,在两个Pod下的/data路径下均存在此文件,表明两个Pod共享一个NAS。