volumes
Container(容器)中的磁盘文件都是短暂的,当容器崩溃时,kubelet会重新启动容器,但最初的文件将会丢失,容器会以最干净的状态启动。另外,当一个pod运行多个容器时,各个容器可能需要共享一些文件,kubernetes volume可以解决这两个问题
卷的类型:
1.configmap
configmap卷也可以作为volume使用,存储在configmap中的数据可以通过configmap类型的卷挂载到pod中,然后使用configmap中的数据,引用configmap对象时,只需要在volume中引用configmap的名称即可,同时也可以自定义configmap的挂载路径。
1.2emptydir
emptydir和volume不同的是,如果删除pod,emptydir卷中的数据也将会被删除,一般emptydir卷用于pod中不同的container共享数据,它可以被挂载到相同或不同的路径上
简单来说,pod删除了,emptyDir也随之删除
默认情况下,emptydir卷支持节点上的任何介质,可能是ssd,磁盘或网络存储,具体取决于自身的环境,可以将emptydir,medium字段设置为memory,让kubernetes使用tmpfs(内存支持的文件系统),虽然tmpfs非常快,但是tmpfs在节点重启时,数据同样会被清除,并且设置的大小会被计入到container的内存限制当中
1.3hostPath
hostpath卷可将节点上的文件或者目录挂载到pod上,用于pod自定义日志输出或访问docker内部的容器等
1.4 NFS
1.5 persistentVolumeClaim
1.6 Secret
1.7 SubPath
pv &pvc
k8s引入了一组叫做pvc和pv的API对象,在pod的Volumes中,只要声明类型是persistentVolumeClaim,指定PVC的名字,当创建这个pvc对象,k8s就自动为他绑定一个符合条件的volume
pvc和pv,类似"接口"和"实现"的思想,开发者用"接口"pvc,运维人员负责绑定具体的实现pv,pvc就是一种特殊的volume
persistentVolume(简称pv)是由管理员设置的存储,它同样时集群中的一类资源,pv时容量插件,如volumes(卷),但其生命周期独立使用pv的任何pod,pv的创建可使用NFS,CEPH等
persistentVolumeClaim(简称pvc)是用户对存储的请求,类似于pod,pod消耗节点资源,pod可以请求特定级别的资源(cpu和内存),pvc可以请求特定的大小和访问模式,例如,可以以一次读写/写或只读多次的模式挂载。
虽然pvc允许用户使用抽象存储资源,但是用户肯呢个需要具有不同性质的pv来解决不同的问题,比如使用ssd硬盘来提高性能,所以集群管理员需要能够提供各种pv,而不仅是大小和访问模式,并且无须让用户了解这些卷的实现方式,对于这些需求可以使用stotageClass资源实现
目前pv的提供方式有两种:静态和动态
静态pv由管理员提前创建,动态pv 无需提前创建,只需指定pvc的storageClass即可
(1)回收策略
当用户使用完卷时,可以从api中删除pvc对象,从而允许回收资源,回收资源会告诉pv如何处理改卷,目前卷可以保留,回收或删除
- Retain: 保留,改策略允许手动回收资源,当删除pvc时,pv仍然存在,volume被视为已释放,管理员可以手动回收卷
- Recycle: 回收,如果volume插件支持,Recycle策略会对卷执行rm -fr 删除该pv
-
delete: 删除,如果volume插件支持,删除pvc时会同时删除pv,
(2)创建pv
在使用持久化时,需要先创建pv,然后在创建pvc,pvc会和pv进行绑定,然后pod即可使用该存储
创建一个基于nfs的pv
创建的pv会有一下几种状态:
- Available(可用),没有被PVC绑定的空间资源
- Bound (已绑定),已经被pvc绑定
- Released (已释放),PVC被删除,但是资源还未被重新使用
-
Failed (失败),自动回收失败
可以创建一个基于hostPath 的pv:
(3)创建pvc
创建pvc需要注意的是,各个方面都符合要求pvc才能和pv进行绑定,比如 accessModes,storageClassName,volumeMode 都需要相同才能进行绑定
创建PVC的示例如下:
pv,pvc pod连接
根据上述hostPath 的pv创建pvc创建pod
pvc
pod