一、K8s存储
1、存储卷基础
在docker容器中,为了实现数据的持久性存储,在宿主机和容器内做映射,可以保证在容器的生命周期结束,数据依旧可以实现持久性存储。
但是在k8s中,由于pod分布在各个不同的节点之上,并不能实现不同节点之间持久性数据的共享,并且,在节点故障时,可能会导致数据的永久性丢失。为此,k8s就引入了外部存储卷的功能。
1.1、emptyDir目录
emptyDir:Pod挂载在本地的磁盘或者内存,被称为emptyDir,称为临时空目录,随着Pod删除,也会被删除。注意:一个容器崩溃了不会导致数据的丢失,因为容器的崩溃并不移除pod.
做一个empty数据卷示例:pod-emp.yaml
命令:kubectl create -f pod-emp.yaml
进入容器:kubectl exec -it empty-pod /bin/sh
运行后查看,挂载描述如下:
使用场景,容器共享文件。在一个pod中有两类容器,一个是主容器,一个是辅助容器,两个容器使用同一个存储卷,辅助容器用来生成新的内容,主容器加载使用。
示例2:运行pod-empty.yaml文件
运行:
kubectl create -f pod-empty.yaml
查看容器:
kubectl get pods -o wide
可看到页面内容不断增加
1.2、gitrepo目录
gitrepo实际上并不是一个新的存储类型,只是emptydir上补添一个git命令来拉取文件而已。当pod创建时候,会拉取git(依赖于宿主机git命令驱动)仓库中数据克隆到本地,并且作为存储卷定义在pod之上。gitrepo基于emptyDir,此存储卷是emptyDir,git仓库中拉取的代码存放在emptyDir后被定义到pod。
因为拉取git仓库的动作,仅仅是在pod创建时触发一次,并不会待续更新文件,因此在工作中基本上无用处。有兴趣的同学可以自行研究一下。
1.3、hostPath目录
hostPath类型则是映射node文件系统中的文件或者目录到pod里。可实现针对某一节点的数据持久化,如果节点宕机了,那数据就丢失了
示例:pod-hostpath.yaml
创建容器:
kubectl create -f pod-hostpath.yaml
进入pod中创建一个测试文件:
kubectl exec -it host-pod /bin/sh
在挂在目录下,创建一个文件:
[root@leader k8s-config]# kubectl exec -it host-pod /bin/sh
/data # echo 123 > 123file
/data # ls
123file
/data # cat 123file
123
/data #
回到pod运行的node机器上查看(leader192.168.30.161),是否存在了这个测试文件
[root@leader ~]# ls /data
ls: cannot access /data: No such file or directory
查看pod信息发现该容器运行在work1上面
然后到work1机器上查看,果然有此文件
[root@work1 ~]# ls /data
123file
[root@work1 ~]#
此后,删除掉pod,此文件也依然存在,可自行去验证。
1.4、nfs共享存储卷
nfs使的我们可以挂在已经存在的共享到的我们的Pod中,nfs不会被删除,仅仅是解除挂在状态而已,这就意味着NFS能够允许我们提前对数据进行处理,而且这些数据可以在Pod之间相互传递.并且,nfs可以同时被多个pod挂在并进行读写
1.5、节点安装配置nfs
1)这里在leader机器上安装nfs:
yum install -y nfs-utils
2)配置nfs:
vi /etc/exports
添加内容:/data/volumes *(rw,no_root_squash)
3)启动并查看:
[root@leader ~]# systemctl start nfs
[root@leader ~]# systemctl start rpcbind
[root@leader ~]# showmount -e localhost
Export list for localhost:
/data/volumes *
[root@leader ~]#
[root@leader ~]# showmount -e
Export list for leader:
/data/volumes *
[root@leader ~]#
1.6、node节点挂载
需要在所有节点安装`nfs-utils` 组件,否则当Pod被分配到没有组件的节点,会启动失败,因为没有`mount.nfs`。
1)安装nfs:
yum install -y nfs-utils
注意:
为了让leader与work节点能互相访问,需要在work节点的host配置里面添加leader节点的信息
2)挂载nfs:
mount -t nfs leader:/data/volumes /nfs
注意:没有则先在work机器新建nfs目录,leader机器新建目录: /data/volumes
解除挂载:umount /nfs
查看挂载效果:mount
在 leader节点/data/volumes目录下新建文件leader_create_file并输入内容its leader create by leader
[root@leader ~]# cd /data/volumes/
[root@leader volumes]# echo its leader create by leader > leader_create_file
[root@leader volumes]# ls
leader_create_file
[root@leader volumes]#
然后回到work节点的nfs目录下查看:
[root@work1 ~]# cd /nfs/
[root@work1 nfs]# ls
leader_create_file
[root@work1 nfs]# cat leader_create_file
its leader create by leader
[root@work1 nfs]#