在docker
中,我们使用-v
来挂载磁盘映射 或者 是使用docker volume
创建存储块,本次我们来看看kubernetes
为我们提供哪些卷存储呢?
众所周知,我们使用kubernetes
最重要的一点为它能够帮助我们动态扩缩容/故障修复/pod
迁移,而我们docker
使用-v
做磁盘映射的时候是在相应的主机的目录,那么对于kubernetes
又是怎么样的呢? 关于卷的重要性,不言而喻,就不细讲了,我们看看kubernetes volume
就好。
kubernetes volume 类型
这个,其实我们也是可以通过kubectl explain pod.spec.volumes
来获取,这里简单的列举一下我们常用的几种资源类型,而后根据类型,逐步进行讲解。
- emptyDir
表示 pod
共享生存期的临时卷,其存储介质可以为磁盘或者是内存。不管存储介质是何种样式的,该pod
在创建该卷时,会在相应的node
上创建对应的物理存储,若此时pod
崩溃且在别的node
又创建了新pod
,此时该卷数据不会迁移至新node
。
- hostPath
表示将pod
所在node
的定义的文件或者目录直接映射在容器中,换句话说,假设我每个node
所挂载的文件/目录 内容均不一致,当pod
故障修复在别的node
创建pod
后,所得到的文件内容也将不一致,所以最好的结果就是在pod
最开始在哪儿创建的,崩溃后就在相应的node
上创建。
- nfs
表示pod
使用nfs
挂载到容器中,注意,该nfs
服务器应当被提前搭建。
- cephfs
表示pod
使用ceph
挂载到容器中,注意,该ceph
存储服务器应当被提前搭建。
- secret
secret
用于将机密信息传递给pod
,为避免泄露,我们可以将该信息利用kubernetes api
创建为secret
,然后再挂载到pod
中。
- configMap
在kubernetes
中,我们可以将pod
相关设置,以键值对的方式存入configmap
,然后利用挂资源挂载进pod
中,目的是为了避免编写pod
描述文件的时候过于臃肿。
emptyDir用途以及定义
emptyDir用途
emptyDir
作用为 共享pod
生命周期的临时目录,当pod
从node
上被删除的时候,该pod
的emptyDir
也将被删除,基于上述原因,我们可以使用它来做pod
之间的容器共享文件,还有一点,较为重要,其存储介质,可以设置为内存,但是内存被映射成了tmpfs
文件系统。
如上介绍了存储介质,这里再补充一点,如果存储介质设置为存储,那么在node
被重启的时候会被清除掉。
其原理图类似于下图。
emptyDir定义
我们可以使用explain
来获取一下帮助
命令: kubectl explain pod.spec.volumes.emptyDir
我们可以使用medium
来定义存储介质,默认存储在磁盘上,你可以设置为存储在内存中,sizeLimit
设置一些限制,单位: Ki | Mi | Gi | Ti | Pi | Ei
等,这里举一个官方例子: 1.5 等于1500m,1.5Gi==1536Mi
emptyDir 演示
测试效果
我们使用deployment
管理replicaSet
资源,该RS
下管理3个pod
,我们为每个pod
创建2个容器,分别为 tomcat
和 nginx
, 且为pod
创建一个emptyDir
资源,该资源将对应各自容器web
服务的根目录,其原理图应当如下:
创建deployment
根据前面所述原理图,我们很快就可以写好deployment
,其内容如下
在pod
项中,我们按照测试要求,创建了2个容器,分别是tomcat
和nginx
,并且我们为pod
创建了一个emptyDir
卷,分别挂载到nginx
容器的/usr/share/nginx/html
目录和tomcat
容器的/usr/local/tomcat/webapps/ROOT
,该目录均是各自容器的web
根目录。
ok,我们使用kubectl apply -f
来创建kubernetes
。
测试emptyDir
查看启动的pod
使用-l
可以进行label
搜索
测试请求172.17.0.8
pod
向172.17.0.8
的emptyDir
塞入index.html
信息
我们直接使用kubectl exec -it
进去写就可以了
再次访问172.17.0.8
当然,访问该replicaSet
下的其他pod
也会访问报错,因为emptyDir
是为了pod
而言。
总结
我们关于volume
介绍了很多类型,介于经历关系,我就介绍了一种: emptyDir
,并且带着做了一个实验,当然,关于存储而言,在程序看来,底层架构如何,并不会影响实际访问效果,例如, 我们使用emptyDir
,将index.html
存储到内存中,k8s
专门为我们将该内存映射为tmpfs
,对于用户而言,这个是感知不到的,说回emptyDir
,该类型最终适用于该pod
之间共享目录/文件使用,若pod
声明周期停止,则该内容也将会被销毁,所以使用emptyDir
用来做pod
中容器间临时文件存放是最有用的。