容器本身一般不会对数据进行持久化处理,同一个Pod中运行多个容器,经常会需要在这些容器之间进行共享一些数据。Kuberenetes的Volume主要来解决数据存储和共享问题。
Docker也有Volume的概念,但是相对简单,但目前的支持有限。Kubernetes对Volume则有着清晰定义和广泛的支持。其中最核心的理念:Volume只是一个目录,并可以被在同一个Pod中的所有容器访问。而这个目录会是什么样,后端用什么介质和里面的内容则由使用的特定Volume类型决定。
创建一个带Volume的Pod:
spec.volumes 指定这个Pod需要的volume信息 spec.containers.volumeMounts 指定哪些container需要用到这个Volume。 Kubernetes对Volume的支持非常广泛,有很多贡献者为其添加不同的存储支持,也反映出Kubernetes社区的活跃程度。比如emptyDir、
gcePersistentDisk GCE disk、nfs、Ceph、glusterfs、iscsi、gitRepo等。本文验证网络文件系统nfs作为k8s存储后端的可用性。
NFS环境搭建
NFS服务器环境搭建参考网页
https://www.cnblogs.com/mchina/archive/2013/01/03/2840040.html
nfs服务器:10.43.166.108
环境需要安装nfs服务包
yum install nfs
yum install portmap
注意:实际安装的是这个rpm包 rpcbind-0.2.0-33.el7_2.x86_64
配置文件修改
[root@tfg108 ~]# vi /etc/exports
/home/nfs 172.24.1.0/24(rw)
/home/install_share *(ro,no_root_squash)
/tftpboot *(ro)
/linuxinstall *(ro)
其中/home/nfs为nfs服务器上共享目录,172.24.1.0/24为nfs客户端,该IP网段为k8s集群的虚拟机使用的IP,rw为允许读写访问
重启服务
systemctl start rpcbind
systemctl start nfs
虚拟机客户端
[minion@k8-i5tlcanyhw-0-woj4itjbwv6z-kube-master-6cauagnxv5sp tmp108]$ showmount -e 10.43.166.108
Export list for 10.43.166.108:
/linuxinstall *
/tftpboot *
/home/install_share *
/home/nfs 172.24.4.*
挂载到虚机目录(tmp108为虚机上的目录)
sudo mount 10.43.166.108:/home/nfs tmp108
挂载后的nfs信息
[minion@k8-i5tlcanyhw-0-woj4itjbwv6z-kube-master-6cauagnxv5sp tmp108]$ mount |grep nfs
nfsd on /proc/fs/nfsd type nfsd (rw,relatime)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw,relatime)
10.43.166.108:/home/nfs on /var/home/tmp108 type nfs4 (rw,relatime,vers=4.1,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=10.0.0.5,local_lock=none,addr=10.43.166.108)
[minion@k8-i5tlcanyhw-0-woj4itjbwv6z-kube-master-6cauagnxv5sp tmp108]$
创建pv和pvc
[minion@k8-i5tlcanyhw-0-woj4itjbwv6z-kube-master-6cauagnxv5sp test]$ kubectl create -f nfs-pv.yaml
[minion@k8-i5tlcanyhw-0-woj4itjbwv6z-kube-master-6cauagnxv5sp test]$ kubectl create -f nfs-pvc.yaml
创建pv和pvc信息查看
[minion@k8-i5tlcanyhw-0-woj4itjbwv6z-kube-master-6cauagnxv5sp test]$ kubectl get persistentvolume
NAME LABELS CAPACITY ACCESSMODES STATUS CLAIM REASON AGE
nfs <none> 1Mi RWX Bound default/nfs 2h
[minion@k8-i5tlcanyhw-0-woj4itjbwv6z-kube-master-6cauagnxv5sp test]$ kubectl get persistentvolumeclaim
NAME LABELS STATUS VOLUME CAPACITY ACCESSMODES AGE
nfs <none> Bound nfs 1Mi RWX 2h
[minion@k8-i5tlcanyhw-0-woj4itjbwv6z-kube-master-6cauagnxv5sp test]$
创建rc,rc中pod模板使用nfs volume
[minion@k8-i5tlcanyhw-0-woj4itjbwv6z-kube-master-6cauagnxv5sp test]$ kubectl create -f nfs-web-rc.yaml
rc和pod信息
[minion@k8-i5tlcanyhw-0-woj4itjbwv6z-kube-master-6cauagnxv5sp test]$ kubectl get rc
CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS AGE
nfs-web web 10.43.166.108:5050/nginx role=web-frontend 2 28m
[minion@k8-i5tlcanyhw-0-woj4itjbwv6z-kube-master-6cauagnxv5sp test]$
[minion@k8-i5tlcanyhw-0-woj4itjbwv6z-kube-master-6cauagnxv5sp test]$ kubectl get pod
NAME READY STATUS RESTARTS AGE
nfs-web-68aa3 1/1 Running 1 28m
nfs-web-pwyqj 1/1 Running 0 28m
[minion@k8-i5tlcanyhw-0-woj4itjbwv6z-kube-master-6cauagnxv5sp test]$
mount信息
[minion@k8-i5tlcanyhw-0-woj4itjbwv6z-kube-master-6cauagnxv5sp test]$ mount |grep nfs
nfsd on /proc/fs/nfsd type nfsd (rw,relatime)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw,relatime)
10.43.166.108:/home/nfs on /var/home/tmp108 type nfs4 (rw,relatime,vers=4.1,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=10.0.0.5,local_lock=none,addr=10.43.166.108)
10.43.166.108:/home/nfs on /var/lib/kubelet/pods/d9760570-3aef-11e6-805e-fa163ee7798f/volumes/kubernetes.io~nfs/nfs type nfs4 (rw,relatime,vers=4.1,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=10.0.0.5,local_lock=none,addr=10.43.166.108)
10.43.166.108:/home/nfs on /var/lib/kubelet/pods/d9ad5c1f-3aef-11e6-805e-fa163ee7798f/volumes/kubernetes.io~nfs/nfs type nfs4 (rw,relatime,vers=4.1,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=10.0.0.5,local_lock=none,addr=10.43.166.108)
[minion@k8-i5tlcanyhw-0-woj4itjbwv6z-kube-master-6cauagnxv5sp test]$
容器信息
[minion@k8-i5tlcanyhw-0-woj4itjbwv6z-kube-master-6cauagnxv5sp test]$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4287e2d218a8 10.43.166.108:5050/nginx "nginx -g 'daemon off" 4 minutes ago Up 4 minutes k8s_web.661d1cf2_nfs-web-68aa3_default_d9ad5c1f-3aef-11e6-805e-fa163ee7798f_c5aa1fef
93c909bab176 gcr.io/google_containers/pause:2.0 "/pause" 14 minutes ago Up 14 minutes k8s_POD.6059dfa2_nfs-busybox-ir6vq_default_c149e5fd-3af0-11e6-805e-fa163ee7798f_0021cf86
904c61de84b2 gcr.io/google_containers/pause:2.0 "/pause" 14 minutes ago Up 14 minutes k8s_POD.6059dfa2_nfs-busybox-i702s_default_c14990d0-3af0-11e6-805e-fa163ee7798f_1ad96206
462078bc030f 10.43.166.108:5050/nginx "nginx -g 'daemon off" 19 minutes ago Up 19 minutes k8s_web.661d1cf2_nfs-web-pwyqj_default_d9760570-3aef-11e6-805e-fa163ee7798f_02fbd3ab
验证nfs volume可用性
[minion@k8-i5tlcanyhw-0-woj4itjbwv6z-kube-master-6cauagnxv5sp test]$ sudo docker inspect -f '{{.State.Pid}}' 462078bc030f
1410
[minion@k8-i5tlcanyhw-0-woj4itjbwv6z-kube-master-6cauagnxv5sp test]$ sudo nsenter -t 1410 -p -m -u -n -i
root@nfs-web-pwyqj:/#
root@nfs-web-pwyqj:/# mount |grep nfs
10.43.166.108:/home/nfs on /usr/share/nginx/html type nfs4 (rw,relatime,vers=4.1,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=10.0.0.5,local_lock=none,addr=10.43.166.108
root@nfs-web-pwyqj:/usr/share/nginx/html# ls
1.txt 2.txt 3.txt 4.txt index.html
root@nfs-web-pwyqj:/usr/share/nginx/html#
root@nfs-web-pwyqj:/usr/share/nginx/html# touch 222
root@nfs-web-pwyqj:/usr/share/nginx/html# ls
1.txt 2.txt 222 3.txt 4.txt index.html
同一pod中容器与不同pod中容器的数据共享验证流程与验证nfs volume可用性类似,分别进入容器内部进行操作,查看本容器中的修改是否再另一个容器中可见。
作者简介:冯圣琴,程序员,对OpenStack开源项目、虚拟化和容器技术等感兴趣。
标签: git客户端web
评论列表
-i5tlcanyhw-0-woj4itjbwv6z-kube-master-6cauagnxv5sp test]$ kubectl get persistentvolumeclaim NAME LABELS S
addr=10.0.0.5,local_lock=none,addr=10.43.166.108) [minion@k8-i5tlcanyhw-0-woj4itjbwv6z-kube-master-6cauagnxv5sp test]$ 容器信息 [minion@k8-i5tl