本文已参与「新人创作礼」活动,一起开启掘金创作之路。
作者按:
K8s如此火热,这其中容器应用存放文件是如何解决的呢。用过容器的应该都知道,容器中各的文件在磁盘中只是暂时存放一下,如果运行崩溃就会丢失,如果重启之前的容器文件系统内是干净,如何解决文件存放的问题被k8s解决了,咱们就来研究一番。
1、卷
引入这个抽象的概念就解决上述容器无法存储文件问题。Docker有卷vloume的概念,但管理功能有限,k8s支持多类型的卷,pod不但可以同时使用不同类型的卷,还可以控制卷的生命周期,有临时卷和持久卷,临时卷在对应pod被销毁时就不存在。而持久卷就算pod被销毁,也会存在,这样pod就算重启也不会丢失数据了。
2、持久卷使用
(1)在字段.spec.volumes中设置为pod提供的卷,在.spec.containers[*].volumeMounts字段中声明卷在容器中的挂载位置。卷挂载在镜像中指定路径下。
(2)持久卷(persistentVolume PV):是集群中的一块存储,使用存储类来动态使用(Storage Class),持久卷是集群中得到资源,类似于节点一样。
(3)持久卷申请(PersistenVolumeClaim PVC):就是对于存储的需求的申请,pvc会消耗pv资源,pv可以请求特定大小的存储和访问模式来挂载。
(4)PV卷有两种方式,一种静态一种动态,静态就是存在k8s API中,用户可以使用。动态就是静态PV卷与用户的pvc申请不匹配,集群动态创建一个存储卷,这个动作是基于Storageclass实现,pvc申请必须请求某个存储类。
(5)为实现动态存储,需要在API服务器上启动默认存储类(DefaultStorageClass)准入控制器,
3、pvc绑定pv
PVC创建之后会寻找与之匹配的PV卷,二者一对一建立绑定,如果找不到pv卷,pvc状态也会一直处于未绑定状态。Pod将pvc作为存储卷使用,查看pvc的请求,找到对应的卷,然后给pod绑定挂载此卷,支持多种访问模式,在申请时可以指定。
4、持久卷的类型
PV持久卷是用插件形式实现的,k8s目前支持的插件有以下这些
5、PV卷的模式
K8s支持两种卷模式(volumeModes)一个是Filesystem就是文件系统模式,一个是Block存储块内模式,这个模式是一个可选的API参数,默认是文件系统。如果是文件系统模式这个卷就会被pod挂载到某个目录。而块模式,就会给pod以块设备的方式访问卷,这个上面没有任何文件系统,相当于是白卷,pod自行处理这个设备。
6、访问模式
ReadWriteOnce:被一个节点以读写方式挂载,此模式允许在同一节点上的多个Pod访问卷
ReadOnlyMany:可以被多个节点以只读方式挂载
ReadWriteMany:可以被多个节点以只读方式挂载
ReadWriteOncePod:可以被单个pod以读写方式挂载,就可以指定一个pod读写该pvc,这功能1.22版本以上才可使用。
7、回收策略:
Retain:手动回收
Recycle:基础删除(rm -rf /volume/*)
Delete:关联存储删除
目前,只有NFS和HostPath支持回收Recycle
8、卷的阶段
Avaliable:卷是空闲资源,尚未绑定到任何pvc
Bound:已绑定,已绑定到pvc
Released:已释放,绑定pvc被删除,但未被收回
Failed:卷自动回收失败
9、创建pod使用pv卷的流程
(1)创建一个pv卷,单节点可以使用hostpath方式(就是本地节点目录),但是生产一般都会用动态存储方式(网络共享存储)
(2)创建一个pvc与pv绑定
(3)创建一个pod挂载pvc
(4)访问pod内的存储
(5)回收删除pod、pvc、pv
至此,对于k8s的存储有一个大致的了解了,具体还需不断时间,祝学习顺利!