NAS提供了共享存储和持久化存储的服务,满足您需要多个Pod共享数据的应用场景。本文介绍如何使用NAS实现共享存储和持久化存储。
前提条件
已在文件存储控制台创建一个文件系统,请参见挂载NFS协议文件系统。创建的文件系统需要与您的Kubernetes集群在同一可用区。
已在创建好的文件系统中添加容器服务Kubernetes集群的挂载点,请参见管理挂载点。文件系统挂载时的VPC网络要与您Kubernetes集群所在的VPC网络保持一致。
背景信息
NAS支持同时被多个Pod挂载,此时多个Pod可能同时修改相同数据,需要应用自行实现数据的同步。
有状态服务-NAS的使用场景:
对磁盘I/O要求较高的应用。
读写性能相对于对象存储OSS更高。
可实现跨主机文件共享,例如可作为文件服务器。
有状态服务-NAS的使用方式:
手动创建文件系统,并添加挂载点。
手动创建PV及PVC。
本文介绍如何利用阿里云提供的flexvolume插件,通过PV或PVC的方式使用阿里云NAS。
创建PV
创建pv-nas.yaml文件。
apiVersion: v1 kind: PersistentVolume metadata: name: pv-nas labels: alicloud-pvname: pv-nas spec: capacity: storage: 5Gi accessModes: - ReadWriteMany flexVolume: driver: "alicloud/nas" options: server: "***-**.cn-hangzhou.nas.aliyuncs.com" # 请替换为您实际的挂载点。 path: "/k8s1" vers: "4.0"
参数
描述
alicloud-pvname
PV的名称。
server
NAS的挂载点。可在文件存储控制台,单击左侧导航栏的文件系统列表,选择目标文件系统,单击操作列管理,在管理页面单击左侧挂载使用,在挂载点区域,挂载地址即为NAS数据盘的挂载点。
path
NAS的挂载目录,支持挂载NAS的子目录,当子目录不存在时,会在NAS上自动创建子目录并挂载。
vers
(可选)NFS挂载协议的版本号,支持3和4.0,默认情况是3。
mode
(可选)挂载目录的访问权限,默认情况是不配置。
说明挂载NAS的根目录无法配置访问权限。
当NAS中数据量很大时,配置
mode
会导致挂载非常慢,甚至挂载失败,不建议配置。
执行以下命令,创建PV。
kubectl create -f pv-nas.yaml
预期结果:
登录容器服务管理控制台。
在控制台左侧导航栏中,单击集群。
在集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情。
在集群管理页左侧导航栏中,选择
,可以看到刚刚创建的PV。
创建PVC
创建NAS存储声明PVC,使用selector
筛选PV,精确配置PVC和PV的绑定关系。
创建pvc-nas.yaml文件。
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: pvc-nas spec: accessModes: - ReadWriteMany resources: requests: storage: 5Gi selector: matchLabels: alicloud-pvname: pv-nas
执行以下命令,创建PVC。
kubectl create -f pvc-nas.yaml
预期结果:
登录容器服务管理控制台。
在控制台左侧导航栏中,单击集群。
在集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情。
在集群管理页左侧导航栏中,选择
,可以看到刚刚创建的PVC。
创建应用
创建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
执行以下命令,创建Deployment。
kubectl create -f nas.yaml
预期结果:
登录容器服务管理控制台。
在控制台左侧导航栏中,单击集群。
在集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的应用管理。
在目标集群页面下,选择左侧导航栏的
,可以看到刚刚创建的Deployment。
NAS的共享存储
执行以下命令,查看部署的Deployment所在Pod的名称。
kubectl get pod
预期输出:
NAME READY STATUS RESTARTS AGE nas-static-f96b6b5d7-r**** 1/1 Running 0 9m nas-static-f96b6b5d7-w**** 1/1 Running 0 9m
执行以下命令,查看/data路径下的文件。
kubectl exec nas-static-f96b6b5d7-r**** -- ls /data
预期输出:
kubectl exec nas-static-f96b6b5d7-w**** -- ls /data
说明/data路径下为空,没有文件。
执行以下命令,在任意一个Pod的/data路径下创建文件nas。
kubectl exec nas-static-f96b6b5d7-r**** -- touch /data/nas
查看Pod下的文件。
执行以下命令,查看Pod的/data路径下的文件。
kubectl exec nas-static-f96b6b5d7-r**** -- ls /data
预期输出:
nas
执行以下命令,查看另一个Pod的/data路径下的文件。
kubectl exec nas-static-f96b6b5d7-w**** -- ls /data
预期输出:
nas
说明在任意一个Pod的/data下创建的文件,两个Pod下的/data路径下均存在此文件,说明两个Pod共享一个NAS。
NAS的持久化存储
执行以下命令,删除该应用的所有Pod。
kubectl delete pod nas-static-f96b6b5d7-r**** nas-static-f96b6b5d7-wthmb
预期输出:
pod "nas-static-f96b6b5d7-r****" deleted pod "nas-static-f96b6b5d7-w****" deleted
执行以下命令,查看Pod删除及Kubernetes重建Pod的过程。
kubectl get pod -w -l app=nginx
预期输出:
NAME READY STATUS RESTARTS AGE nas-static-f96b6b5d7-r**** 1/1 Running 0 27m nas-static-f96b6b5d7-w**** 1/1 Running 0 27m nas-static-f96b6b5d7-r**** 1/1 Terminating 0 28m nas-static-f96b6b5d7-w**** 0/1 Pending 0 0s nas-static-f96b6b5d7-w**** 0/1 Pending 0 0s nas-static-f96b6b5d7-w**** 0/1 ContainerCreating 0 0s nas-static-f96b6b5d7-w**** 1/1 Terminating 0 28m nas-static-f96b6b5d7-n**** 0/1 Pending 0 0s nas-static-f96b6b5d7-n**** 0/1 Pending 0 0s nas-static-f96b6b5d7-n**** 0/1 ContainerCreating 0 0s nas-static-f96b6b5d7-r**** 0/1 Terminating 0 28m nas-static-f96b6b5d7-w**** 0/1 Terminating 0 28m nas-static-f96b6b5d7-r**** 0/1 Terminating 0 28m nas-static-f96b6b5d7-r**** 0/1 Terminating 0 28m nas-static-f96b6b5d7-w**** 1/1 Running 0 10s nas-static-f96b6b5d7-w**** 0/1 Terminating 0 28m nas-static-f96b6b5d7-w**** 0/1 Terminating 0 28m nas-static-f96b6b5d7-n**** 1/1 Running 0 17s
执行以下命令,查看Kubernetes重建的Pod名称。
kubectl get pod
预期输出:
NAME READY STATUS RESTARTS AGE nas-static-f96b6b5d7-n**** 1/1 Running 0 21s nas-static-f96b6b5d7-w**** 1/1 Running 0 21s
查看Pod下的文件。
执行以下命令,查看Pod的/data路径下的文件。
kubectl exec nas-static-f96b6b5d7-n**** -- ls /data
预期输出:
nas
执行以下命令,查看另一个Pod的/data路径下的文件。
kubectl exec nas-static-f96b6b5d7-w**** -- ls /data
预期输出:
nas
说明刚刚创建的文件nas并没有被删除,说明NAS的数据可持久保存。