k8s中使用nfs共享存储

持久卷使用(nfs存储数据) Kubernetes 为了使应用程序及其开发人员能够正常请求存储资源,避免处理存储设施细节,引入了 PV 和 PVC。创建 PV 有两种方式:

  • 集群管理员通过手动方式静态创建应用所需要的 PV;
  • 用户手动创建 PVC 并由 Provisioner 组件动态创建对应的 PV。
搭建nfs服务器(ip:192.168.0.29) 找一台服务器搭建nfs服务端, 我以centos7为例
安装nfs yum -y install nfs-utils#创建nfs目录 mkdir -p /nfs/data/#修改权限 chmod -R 777 /nfs/data#编辑export文件 vim /etc/exports /nfs/data *(rw,no_root_squash,sync)(“*“代表所有人都能连接,建议换成具体ip或ip段,如192.168.20.0/24)#配置生效 exportfs -r #查看生效 exportfs#启动rpcbind、nfs服务 systemctl restart rpcbind && systemctl enable rpcbind systemctl restart nfs && systemctl enable nfs#查看 RPC 服务的注册状况 rpcinfo -p localhost#showmount测试 showmount -e 192.168.92.56#所有node节点安装nfs客户端 yum -y install nfs-utils systemctl start nfs && systemctl enable nfs

1.静态创建PV卷 添加pv卷对应目录,这里创建2个pv卷,则添加2个pv卷的目录作为挂载点。
#nfs服务器操作 #创建pv卷对应的目录 mkdir -p /nfs/data/pv001 mkdir -p /nfs/data/pv002#配置exportrs vim /etc/exports /nfs/data *(rw,no_root_squash,sync) /nfs/data/pv001 *(rw,no_root_squash,sync) /nfs/data/pv002 *(rw,no_root_squash,sync)#配置生效 exportfs -r #重启rpcbind、nfs服务 systemctl restart rpcbind && systemctl restart nfs

第一步:集群管理员创建 NFS PV,NFS 属于 K8s 原生支持的 in-tree 存储类型。yaml 文件如下:
# cat nfs-pv1.yaml apiVersion: v1 kind: PersistentVolume metadata: name: nfs-pv001 labels: pv: nfs-pv001 spec: capacity: storage: 1Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle storageClassName: nfs nfs: path: /nfs/data/pv001 server: 192.168.0.29# cat nfs-pv2.yaml apiVersion: v1 kind: PersistentVolume metadata: name: nfs-pv002 labels: pv: nfs-pv002 spec: capacity: storage: 1Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle storageClassName: nfs nfs: path: /nfs/data/pv002 server: 192.168.0.29

配置说明
配置说明: ① capacity 指定 PV 的容量为 1G。 ② accessModes 指定访问模式为 ReadWriteOnce,支持的访问模式有:ReadWriteOnce – PV 能以 read-write 模式 mount 到单个节点。 ReadOnlyMany – PV 能以 read-only 模式 mount 到多个节点。 ReadWriteMany – PV 能以 read-write 模式 mount 到多个节点。③ persistentVolumeReclaimPolicy 指定当 PV 的回收策略为 Recycle,支持的策略有:Retain – 需要管理员手工回收。 Recycle – 清除 PV 中的数据,效果相当于执行 rm -rf /thevolume/*。 Delete – 删除 Storage Provider 上的对应存储资源,例如 AWS EBS、GCE PD、Azure Disk、OpenStack Cinder Volume 等。④ storageClassName 指定 PV 的 class 为 nfs。相当于为 PV 设置了一个分类,PVC 可以指定 class 申请相应 class 的 PV。 ⑤ 指定 PV 在 NFS 服务器上对应的目录。

[root@vm192-168-0-79 ~]# kubectl apply -f pv1.yaml persistentvolume/nfs-pv001 created[root@vm192-168-0-79 ~]# kubectl apply -f pv2.yaml persistentvolume/nfs-pv002 created[root@vm192-168-0-79 ~]# kubectl get pv NAMECAPACITYACCESS MODESRECLAIM POLICYSTATUSCLAIMSTORAGECLASSREASONAGE nfs-pv0011GiRWORecycleAvailablenfs10m nfs-pv0021GiRWORecycleAvailablenfs3m2s# STATUS 为 Available,表示 pv就绪,可以被 PVC 申请。

第二步:用户创建 PVC,yaml 文件如下:
接下来创建一个名为pvc001,pvc002的pvc
# cat nfs-pvc1.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: nfs-pvc001 spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi storageClassName: nfs selector: matchLabels: pv: nfs-pv001# cat nfs-pvc2.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: nfs-pvc002 spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi storageClassName: nfs selector: matchLabels: pv: nfs-pv002

[root@vm192-168-0-79 ~]# kubectl apply -f pvc1.yaml persistentvolumeclaim/nfs-pvc001 created[root@vm192-168-0-79 ~]# kubectl apply -f pvc2.yaml persistentvolumeclaim/nfs-pvc002 created[root@vm192-168-0-79 ~]# kubectl get pv NAMECAPACITYACCESS MODESRECLAIM POLICYSTATUSCLAIMSTORAGECLASSREASONAGE nfs-pv0011GiRWORecycleBounddefault/nfs-pvc001nfs12m nfs-pv0021GiRWORecycleBounddefault/nfs-pvc002nfs5m[root@vm192-168-0-79 ~]# kubectl get pvc NAMESTATUSVOLUMECAPACITYACCESS MODESSTORAGECLASSAGE nfs-pvc001Boundnfs-pv0011GiRWOnfs15s nfs-pvc002Boundnfs-pv0021GiRWOnfs15s

从 kubectl get pvc 和 kubectl get pv 的输出可以看到 pvc001 和pvc002分别绑定到pv001和pv002,申请成功。注意pvc绑定到对应pv通过labels标签方式实现,也可以不指定,将随机绑定到pv。
第三步:用户创建应用,并使用第二步创建的 PVC。
# cat pod1.yaml kind: Pod apiVersion: v1 metadata: name: nfs-pod001 spec: containers: - name: myfrontend image: nginx:latest volumeMounts: - mountPath: "/var/www/html" name: nfs-pv001 volumes: - name: nfs-pv001 persistentVolumeClaim: claimName: nfs-pvc001# cat pod2.yaml kind: Pod apiVersion: v1 metadata: name: nfs-pod002 spec: containers: - name: myfrontend image: nginx:latest volumeMounts: - mountPath: "/var/www/html" name: nfs-pv002 volumes: - name: nfs-pv002 persistentVolumeClaim: claimName: nfs-pvc002

与使用普通 Volume 的格式类似,在 volumes 中通过 persistentVolumeClaim 指定使用nfs-pvc001和nfs-pvc002申请的 Volume。
[root@vm192-168-0-79 ~]# kubectl apply -f pod1.yaml pod/nfs-pod001 created[root@vm192-168-0-79 ~]# kubectl apply -f pod2.yaml pod/nfs-pod002 created[root@vm192-168-0-79 ~]# kubectl get po NAMEREADYSTATUSRESTARTSAGE nfs-pod0011/1Running062s nfs-pod0021/1Running07s[root@vm192-168-0-79 ~]# kubectl exec nfs-pod001 touch /var/www/html/index001.html [root@vm192-168-0-79 ~]# kubectl exec nfs-pod002 touch /var/www/html/index002.html# 在nfs服务器验证 [root@vm192-168-0-29 pv001]# ls /nfs/data/pv001 index001.html [root@vm192-168-0-29 pv001]# ls /nfs/data/pv002 index002.html

进入pod查看挂载情况
[root@vm192-168-0-79 ~]#kubectl exec -ti nfs-pod001 /bin/bash root@nfs-pod001:/# df -h ... 192.168.0.29:/nfs/data/pv001197G2.8G186G2% /var/www/html ...

删除pv
删除pod,pv和pvc不会被删除,nfs存储的数据不会被删除。
[root@vm192-168-0-79 ~]# kubectl delete -f pod1.yaml pod "nfs-pod001" deleted[root@vm192-168-0-79 ~]# kubectl get pv NAMECAPACITYACCESS MODESRECLAIM POLICYSTATUSCLAIMSTORAGECLASSREASONAGE nfs-pv0011GiRWORecycleBounddefault/nfs-pvc001nfs38m nfs-pv0021GiRWORecycleBounddefault/nfs-pvc002nfs31m [root@vm192-168-0-79 ~]# kubectl get pvc NAMESTATUSVOLUMECAPACITYACCESS MODESSTORAGECLASSAGE nfs-pvc001Boundnfs-pv0011GiRWOnfs26m nfs-pvc002Boundnfs-pv0021GiRWOnfs26m# nfs服务器查看 [root@vm192-168-0-29 pv001]# ls /nfs/data/pv001 index001.html

继续删除pvc,pv将被释放,处于 Available 可用状态,并且nfs存储中的数据被删除。
[root@vm192-168-0-79 ~]# kubectl delete -f pvc1.yaml persistentvolumeclaim "nfs-pvc001" deleted[root@vm192-168-0-79 ~]# kubectl get pv NAMECAPACITYACCESS MODESRECLAIM POLICYSTATUSCLAIMSTORAGECLASSREASONAGE nfs-pv0011GiRWORecycleAvailablenfs40m nfs-pv0021GiRWORecycleBounddefault/nfs-pvc002nfs32m# nfs服务器查看 [root@vm192-168-0-29 pv001]# ls /nfs/data/pv001 [root@vm192-168-0-29 pv001]#

【k8s中使用nfs共享存储】继续删除pv
[root@vm192-168-0-79 ~]# kubectl delete -f pv1.yaml persistentvolume "nfs-pv001" deleted

动态创建pv
项目地址: https://github.com/kubernetes-incubator/external-storage/tree/master/nfs-client

    推荐阅读