场景描述
其实pod的数据存储和容器的 数据存储是类似的,pod之所以要定义这个概念,是由于容器对于存储 的需求来 展开的,再次印证一个概念,pod是一组容器的结合,容器运行需要 的技术pod全部需要封装实现。且最终的实现原理是大半是通过kubelet启动pod是通过runtime对docker cli的参数注入。
- 无状态容器:容器释放后,其所产生的数据随之释放,而我们 并不关注,不属于生产事故!比如一个busybox容器。
- 有状态容器:redis,etcd,mysql这类容器我们定义为有状态容器,是因为该类容器启动的意义在于数据存储以及对于 其他容器的响应请求,如果我们不把数据长期存储起来,那么容器一旦崩溃,对应的数据全部丢失。
那么对于有状态容器就需要通过一定的手段来进行容器启动后数据的长久存储,用docker举例,docker的数据存储有3类。
docker的volume:使用docker -v host相对目录:容器绝对目录
- volume使用host相对目录,是在docker的工作目录下默认创建的
- 挂载不会覆盖容器内目录的文件
- 不支持文件形式的挂载
docker的bind mounts:使用docker -v host绝对目录:容器绝对目录
- bind mounts使用host的绝对目录
- 挂载会覆盖容器内目录的文件
- 支持文件形式的挂载
dokcer的tmpfs bind mounts:tmpfs正是linux的tmpfs,同样和docker的生命周期绑定,但是可以提高读写性能。
pod的数据存储
volume:pod内多个容器共享的目录,在pod中直接定义引用,pod没了volume也没了。
所以主要目的是pod内的容器数据共享。
volume支持很多类型,最常用的是emptydir,hostpath。
emptydir是pod在创建时候同步创建的,数据块内容为空,且用户无法控制emptydir的磁盘类型,和node是绑定的。但是可以将emptyDir.medium字段设置为"Memory",以告诉 Kubernetes 为您安装 tmpfs(基于 RAM 的文件系统)。 虽然 tmpfs 速度非常快,但是要注意它与磁盘不同。 tmpfs 在节点重启时会被清除,并且您所写入的所有文件都会计入容器的内存消耗,受容器内存限制约束。所以它的机制类似于docker的volume和tmpfs bind mount
hostpath:支持将主机的文件系统进行挂载,所以这块有一个问题,虽然volume的生命周期和pod一致,但是通过hostpath这种其实是可以保留数据的,這和 epptydir的差距在此。它的机制类似于docker的bind mount。同时hostpath通过type字段支持路径是否应该存在,不存在是否创建。下图的type的Directory说明/data目录必须在host存在,同时可以使用type:DirectoryOrCreate说明/date路径不存在,则在host创建。
更多信息参考https://kubernetes.io/zh/docs/tasks/configure-pod-container/configure-persistent-volume-storage/
persistent volume:作为一种资源对象,需要yaml显示的声明,pod通过pvc引用,来 实现pod内容器的持续存储。它可以用来实现pod的数据的持久存储。
persistent volume具有一下特点:
1.PV只能是网络存储,为什么呢,因为pod不可能只调度到一个node。个人认为假如node的后端存储类型不一致,容量不一致。那pod去引用的时候会出现不必要的麻饭,所以存储作为计算资源的一部分,让pv去管理起来,脱离和node的关系或者并不对外体现node的概念,这样才是最稳的!
2.pv和pod没有关系,两者需要独立定义。
3.pv 的类型虽然只能支持网络存储,但是还有一中特殊的类型hostPath,可以用于单机测试。
PV的深入理解
上图我们可以看到PV有几个关键参数
capacity:定义pv的存储大小能力
accessModes:访问模式,readwirteonce只能被单个node挂载。readwritemany:可以被多个node挂载,readonlymany:被多个node只读。hostpath这种特殊的pv类型只能是readwirteonce。
class:存储类型。常用的可能有nfs,cinder,hostpath。其他过的不在描述。
Reclaim policy:回收策略,包括保留,回收,删除等三种策略。回收策略的意义在于当pod不在显示的申明pvc的引用的时候,PV对于pvc的处理策略。
目前只有nfs hostpath支持回收策略。AWS cinder等支持删除策略。
使用过程
1.创建PV,类型为hostpath
2.创建PVC
3.创建pod绑定pvc