《深入剖析Kubernetes》中使用了Rook来搭建存储,而K8s本身也支持直接使用NFS。本次实验主要为后续学习做铺垫,使用现有NFS存储做为跨节点数据持久化,并简单的学习其实现原理。
安装NFS客户端
分别在各个node上安装
1 | $ apt install nfs-common |
测试
1 | $ mount -t nfs 10.160.12.7:/data/share /mnt |
NFS的PV及PVC测试
新建PV
1 | apiVersion: v1 |
1 | $ kubectl get pv |
新建PVC
1 | apiVersion: v1 |
注:storageClassName同PV的storageClassName
1 | $ kubectl get pvc |
测试PVC
测试思路:
- 创建一个pod,使用pvc
- 在挂载目录下创建文件
- 再次创建一个pod,挂载pvc,检查其中文件
- 删除两个pod,重新创建一个使用pvc的pod,然后检查数据
- 同步检查跨节点时的状况
1. 创建一个pod,使用pvc
1 | apiVersion: v1 |
1 | $ kubectl get pods -o wide |
2. 在挂载目录下创建文件
1 | $ kubectl exec -it pvc-test-pod1 -- /bin/sh |
3. 创建第二个pod
1 | apiVersion: v1 |
1 | $ kubectl get pods -o wide |
1 | $ kubectl exec -it pvc-test-pod2 -- ls /mnt/ |
4. 删除原来的pod并重建新的pod
1 | $ kubectl delete pod pvc-test-pod1 |
1 | apiVersion: v1 |
1 | $ kubectl get pods -o wide |
1 | $ kubectl exec -it pvc-test-pod3 -- ls /mnt |
5. 测试跨节点
由于总是调度在node2上,不得已,使用deployment
1 | apiVersion: apps/v1 |
1 | $ kubectl get pods -o wide |
1 | $ kubectl exec -it nfs-pvc-dp-559d75db66-dg6th -- cat /mnt/test.txt |
看看底层
可以使用Linux的mount命令查看两个worker节点上的mount状况
1 | # node2 |
1 | $ mount | grep 10.160.12.7 |
可以看出:10.160.12.7:/data/share/bqi
被分别挂载到了对应的pod的目录下
自动创建PV及PVC
当我以为这样就完了的时候,用着用着,我发现,一个PV只能被一个PVC绑定。所以,实际上之前的操作,都局限在将一个nfs的目录变成了一个PV,然后绑定到了PVC,最后挂载到了某个pod上。
而后续实验中发现,存储状态的实验需要不同的pod用不同的PVC。那我不可能总是手工去创建一个PV。于是,需要用到nfs-client-provisioner
nfs-client-provisioner
nfs-client-provisioner
可以利用NFS Server给Kubernetes作为持久存储的后端,并且动态提供PV。可以参考https://github.com/kubernetes-incubator/external-storage/tree/master/nfs-client
安装方式也有多种,这里采用helm方式安装,非常简单
1 | $ helm install --set nfs.server=10.160.12.7 --set nfs.path=/data/share/bqi stable/nfs-client-provisioner |
参数说明:
- nfs.server - nfs服务器的地址
- nfs.path - nfs共享出来的目录
1 | $ helm list |
1 | $ helm status crusty-penguin |
可以看到,主要部署了:
- Role, roleBinding, serviceAccount
- Deployment
- StorageClass
其中,比较重要的是StorageClass
,当前为nfs-client
。当创建PVC时,指定了storageClassName
为nfs-client
后,将会自动创建PV及PVC
测试
- 创建pvc
1 | apiVersion: v1 |
- 查看pv及pvc
1 | $ kubectl get pvc |
1 | $ kubectl get pv |
- 查看nfs服务器上的目录
1 | $ ls -l |
可以看到,对应的nfs服务器上的目录中创建了一个目录
小结
本次实验主要是想通过NFS创建PV及PVC,以提供跨节点数据持久化
注:没有演示搭建nfs服务器的方法,网上教程很多
- 在创建PV时,指定了nfs方式
- 基于nfs的PV创建PVC,分布于多个节点上的pod可以共享数据
- 使用nfs-client-provisioner自动创建PV及PVC