一个pod内有多个容器,我们知道这些容器是共享网络栈的,但是文件系统却似乎还不能共享?如果一个容器运行了一段时间,崩溃重启了,里面保存的内容都丢失了,这又该如何解决?带着这些疑问我们一起来学习k8s中负责数据存储的组件:volume。
我是T型人小付,一位坚持终身学习的互联网从业者。喜欢我的博客欢迎在csdn上关注我,如果有问题欢迎在底下的评论区交流,谢谢。
Docker中的数据保存
docker启动容器,只要容器不被删除其内部的文件不会消失
[root@k8s-node1 ~]# docker run -it -d victor2019/test:v1
e64c2bc31ac04174c1c78f9223e01a2cdec371104c58b74bdfc0a439913bf2d3
之后往容器内写点东西,因为我这个测试镜像是nginx,所以写到主页面便于测试
[root@k8s-node1 ~]# docker exec e64c bash -c "echo hello > /usr/share/nginx/html/index.html"
查看一下容器的docker0网段的ip
[root@k8s-node1 ~]# docker inspect e64c | grep 172
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
验证下写进去的内容
[root@k8s-node1 ~]# curl 172.17.0.2
hello
然后停掉容器再启动
[root@k8s-node1 ~]# docker kill e64c
e64c
[root@k8s-node1 ~]# docker start e64c
e64c
[root@k8s-node1 ~]# curl 172.17.0.2
hello
容器内的文件一直都还在。
所以直接用docker起容器的话,指定--restart=always
就可以保证容器提供持续服务了。
K8s中的数据保存
但是k8s的机制不一样,每个pod都有自己完整的生命周期,即使没有被人为删除,如果pod因为其中某个容器崩溃重启,不仅pod的ip会变,里面所有容器保存的内容也会全部消失
那么有没有一种办法,可以让k8s的pod可以和docker里面的容器一样,除非是被人为删除,不然即使重启里面保存的东西一直都在。我们这一节要学习的volume就是为了解决这个问题而引入的。
需要注意,docker中也有volume的概念,不过docker中的volume是容器的内容在宿主机磁盘的持久化,即使容器删除也会一直在,和我们下一节要学习的PVC有点像,但是和这里k8s的volume是两个东西,要注意区分
k8s中的volume
volume就是一个可以被pod中所有容器使用的公共文件夹,每个容器可以将这个