今天尝试学习一下k8s的pv&pvc,并记录下实验的过程
pv&pvc简介
k8s提供了emptyDir
,hostPath
,rbd
,cephfs
等存储方式供容器使用,不过这些存储方式都有一个缺点:开发人员必须得知指定存储的相关配置信息,才能使用存储.例如要使用cephfs
,Pod
的配置信息就必须指明cephfs
的monitor
,user
,selectFile
等等,而这些应该是系统管理员的工作.对此,k8s提供了两个新的API资源:PersistentVolume
,PersistentVolumeClaim
PV(PersistentVolume
)是管理员已经提供好的一块存储.在k8s集群中,PV
像Node
一样,是一个资源
PVC(PersistentVolumeClaim
)是用户对PV
的一次申请.PVC
对于PV
就像Pod
对于Node
一样,Pod
可以申请CPU
和Memory
资源,而PVC
也可以申请PV
的大小与权限
有了PersistentVolumeClaim
,用户只需要告诉Kubernetes
需要什么样的存储资源,而不必关心真正的空间从哪里分配,如何访问等底层细节信息;这些Storage Provider
的底层信息交给管理员来处理,只有管理员才应该关心创建PersistentVolume
的细节信息
实验
实验环境:
192.168.122.10:host1,Master
192.168.122.20:host2,Node
192.168.122.30:host3,Node
目的:使用nfs类型的PV,并使用Job验证PV创建是否创建成功
1. 在host1上创建nfs服务器,用于提供存储
安装nfs服务端:
1 | [root@host1 kube]# yum install nfs-utils rpcbind |
创建用于nfs服务的存储文件夹:
1 | [root@host1 kube]# mkdir -p /data/nfs |
编辑/etc/exports
文件:
1 | [root@host1 kube]# vim /etc/exports |
开启nfs服务:
1 | [root@host1 kube]# systemctl start nfs-server.service |
检验是否开启成功:
1 | [root@host1 kube]# showmount -e |
2. 创建pv
编辑pv资源的配置文件:
1 | [kube@host1 ~]$ cat pv_nfs.yml |
应用该pv资源:
1 | [kube@host1 ~]$ kubectl apply -f pv_nfs.yml |
查看该pv资源:
1 | [kube@host1 ~]$ kubectl get pv |
3. 创建pvc
编辑pvc资源配置文件:
1 | [kube@host1 ~]$ cat pvc_nfs.yml |
应用pvc配置文件:
1 | [kube@host1 ~]$ kubectl apply -f pvc_nfs.yml |
查看该pvc资源:
1 | [kube@host1 ~]$ kubectl get pvc |
4. 创建应用资源,使用pvc存储
编辑应用资源配置文件:
1 | [kube@host1 ~]$ cat pvjob.yml |
该job将在nfs的volume创建一个hello文件,打印”hello pv”字符串
应用该Job资源:
1 | [kube@host1 ~]$ kubectl apply -f pvjob.yml |
查看host1上的/data/nfs目录,检查实验结果:
1 | [kube@host1 ~]$ cat /data/nfs/hello |
实验成功!
排错
在这次实验中出现了几个错误:
1. 使用pvc存储的pod一直处于pending状态,无法启动
1 | [kube@host1 ~]$ kubectl get pod |
查看该pod的启动事件:
1 | [kube@host1 ~]$ kubectl describe pod pvjob-47cwq |
注意到报错信息:wrong fs type, bad option, bad superblock on 192.168.122.10:/data/nfs
,这是因为host3没有安装nfs-utils
软件包,无法识别nfs
类型的文件系统,也无法作为nfs
的客户端使用
解决方案:安装nfs-utils
软件包,删除之前创建失败的Job
资源并重新创建
1 | [root@host3 ~]# yum install nfs-utils -y |
可以看到,Job
资源正常创建:
1 | [kube@host1 ~]$ kubectl get pod |
2. 使用pvc的job执行失败
1 | [kube@host1 ~]$ kubectl get pod |
查看执行失败Job
的log日志:
1 | [kube@host1 ~]$ kubectl logs pvjob-74g64 |
解决方案:
Permission denied
多见于普通用户执行高权限命令失败,不过busybox
容器本身使用的就是root
用户,因此不存在这个问题.在nfs中,nfs服务端没有权限访问挂载的目录也会导致这个问题
更改目录属主为nfsnobody
:
1 | [kube@host1 ~]$ sudo chown nfsnobody /data/nfs |
删除原来Job
并重新创建:
1 | [kube@host1 ~]$ kubectl delete jobs pvjob.yml |
可以看到,Job
执行成功:
1 | [kube@host1 ~]$ kubectl get pod |