第13章 持久化存储
容器是镜像的运行时实例,为了保证镜像能够重复的产出具备一致性的运行时实例,必须要求镜像本身是持久且稳定的,这决定了在容器中发生的一切数据
变动操作都不能真正写入镜像当中,否则必然会破坏镜像不变的性质。为此,容器中的数据修改操作大多是基于写时复制(Copy-on-Write)策略来实现的。
容器会利用叠加式文件系统(OverlayFS)的特性,在用户意图修改数据的时候,自动将变更的内容写入独立区域,再与原有的数据叠加到一起,使其从外观上
看像是"覆盖"了原有内容。这种改动通常是临时的,一旦容器终止运行,这些存储于独立区域中的变动信息也会一并删除,不复存在。由此可见,如果不额外处理,
容器默认是不具备持久化存储能力的。
而另外一方面,容器作为信息系统的运行载体,必定会产出有价值、应该被持久化保存的信息,譬如扮演数据库角色的容器;多个容器之间有时候也需要通过
共享存储来实现某些交互操作。
13.1 Kubernetes存储设计
k8s 提出了如此多关于存储的概念,最重要的原因是存储技术本来就种类繁多,为了尽可能兼容各种存储技术,k8s不得不预置了很多In-Tree插件来
对接,让用户根据自己的需要来选择。同时,为了兼容那些不在预置范围内的需求场景,支持用户使用 FlexVolume或者CSI 来定制Out-of-Tree插件,
实现更加丰富的存储能力。
13.1.1 Mount和Volume
Mount和Volume 都是源自操作系统的常用术语。Mount是动词,表示将某个外部存储挂载到系统中;Volumn是名词,表示物理存储的逻辑抽象,目的是
为物理存储提供有弹性的分割方式。容器源于对操作系统层的虚拟化,为了满足容器内 生成数据的外部存储需求,很自然的会将
|