Kubernetes集群定义nfs类型的Volume

使用阿里云文件服务定义Kubernetes集群nfs类型的Volume

Kubernetes集群提供了Volume的抽象,可以支持Pod中的容器共享文件和文件持久化存储的场景;NFS Volume允许将现有的 NFS(网络文件系统)共享挂载到集群的容器中,当Pod被删除时,NFS Volume中的文件内容被保留,并且NFS可以被多个源同时挂载,这就意味着NFS可以在Kubernetes集群的Pod之间提供数据共享。

阿里云文件服务(Cloud File Service)是一种高可靠、可扩展、可共享访问的全托管分布式文件系统。支持标准的NFSv4.0和NFSv4.1协议,提供全托管的服务,你无需修改应用,通过标准的文件系统挂载步骤即可实现与Kubernetes集群的无缝集成。更多详情参考阿里云文件服务产品文档。

本文将提供在Kubernetes集群中以NFS Volume方式挂载阿里云文件服务的操作步骤和应用示例。

一、购买CFS文件存储

你需要首先购买一个CFS文件存储,建议你在Kubernetes集群的Node子网中购买文件存储;

文件存储支持通过挂载目标的IP地址挂载文件存储,你可以在文件存储详情页查询挂载目标的IP地址,详情参考文件存储信息。

二、连接到集群

Kubernetes 命令行客户端 kubectl可以让你从客户端计算机连接到 Kubernetes 集群,实现应用部署。详情参考使用Kubectl客户端连接到Kubernetes集群。

三、Pod通过NFS Volume方式使用CFS文件存储

说明: 你需要在集群的Node节点上安装nfs驱动。驱动安装过程参考挂载文件存储

#在Node节点的终端下,运行如下命令:sudo yum install –y nfs-utils 新建一个Pod,将第一部分购买的CFS文件存储通过NFS Volume方式挂载到Pod,并在CFS目录下写入文件。Pod YAML文件说明如下: kind: PodapiVersion: v1metadata: name: write-data-to-cfsspec: containers: - name: producer image: busybox imagePullPolicy: IfNotPresent command: - /bin/sh args: - -c - while true; do ts=`date +%s`; echo "${ts} hello world" /mnt/cfs-write/hello.log; sleep 1; done volumeMounts: - mountPath: "/mnt/cfs-write" #你可以根据项目情况修改CFS的挂载目录 name: cfs volumes: - name: cfs nfs: path: /cfs#请使用挂载目标支持的目录替换,默认挂载到/cfs目录 server: 10...11#请使用文件存储的挂载目标IP地址替换 readOnly: false

参数说明

上述YAML文件将CFS挂载目标的"/cfs"目录挂载到Pod的/mnt/cfs-write目录;你可以执行如下命令下载示例Yaml文件:

wget https://kubernetes.s3.cn-north-1.jdcloud-oss.com/CFS/write-data-to-cfs.yml

购买Pod前,请根据文件存储信息修改Yaml文件中对应参数值。

执行如下命令,购买Pod并确定Pod运行状态 kubectl create -f write-data-to-cfs.yml # 文件名称write-data-to-cfs.yml可使用本地目录保存的文件替换kubectl get podsNAME READY STATUS RESTARTS AGEwrite-data-to-cfs 1/1 Running 0 3m1s

执行如下命令进入Pod,查看/mnt/cfs-write/hello.log文件中保存的内容: kubectl exec -it write-data-to-cfs /bin/sh/ # cat /mnt/cfs-write/hello.log输出示例如下:1564989208 hello world1564989209 hello world1564989210 hello world1564989211 hello world1564989212 hello world1564989213 hello world1564989214 hello world1564989215 hello world1564989217 hello world1564989218 hello world

wget https://kubernetes.s3.cn-north-1.jdcloud-oss.com/CFS/read-data-from-cfs.yml

执行如下命令删除Pod kubectl delete pod write-data-to-cfspod "write-data-to-cfs" deleted四、验证CFS文件存储中被持久化保存的数据重新购买一个Pod,将第一部分购买的CFS文件存储通过NFS Volume方式挂载到Pod,并验证CFS目录下的文件内容。Pod Yaml文件说明如下: kind: PodapiVersion: v1metadata: name: read-data-from-cfsspec: containers: - name: consumer image: busybox imagePullPolicy: IfNotPresent command: - /bin/sh args: - -c - while true; do ls -l /mnt/cfs-read/; sleep 2; done volumeMounts: - mountPath: "/mnt/cfs-read"#你可以根据项目情况修改CFS的挂载目录 name: cfs readOnly: true volumes: - name: cfs nfs: path: /cfs#请使用挂载目标支持的目录替换,默认挂载到/cfs目录 server: 10...11 #CFS文件存储的挂载目标IP地址,请与第二步测试中使用的挂载目标IP地址保持一致 readOnly: true上述YAML文件将CFS挂载目标的"/cfs"目录挂载到Pod的/mnt/cfs-read目录;你可以执行如下命令下载示例Yaml文件:购买Pod前,请根据文件存储信息修改Yaml文件中对应参数值。

购买Pod,验证Pod处于运行状态时,执行如下命令进入Pod,查看/mnt/cfs-read目录下的文件内容 kubectl create -f read-data-from-cfs.yml # 文件名称read-data-from-cfs.yml可使用本地目录保存的文件替换kubectl get podsNAME READY STATUS RESTARTS AGEread-data-from-cfs 1/1 Running 0 15skubectl exec -it read-data-from-cfs /bin/sh/ # cat /mnt/cfs-read/hello.log输出示例如下:1564989208 hello world1564989209 hello world1564989210 hello world1564989211 hello world1564989212 hello world1564989213 hello world1564989214 hello world1564989215 hello world1564989217 hello world1564989218 hello world3. 通过第2步的验证即可发现,名称为write-data-to-cfs的Pod在CFS中写入的文件hello.log被持久化保存到CFS文件存储,并且可以被名称为read-data-from-cfs的Pod共享。

执行如下命令删除Pod kubectl delete pod read-data-from-cfspod "read-data-from-cfs" deleted