Bootstrap

18 K8S之存储卷简述

Pod本身有生命周期,其应用容器及生成的数据自身均无法独立于该生命周期之外持久存在,并且同一Pod中的容器可共享PID、Network、IPC和UTS名称空间,但Mount和USER名称空间却各自独立,因而跨容器的进程彼此间默认无法基于共享的存储空间交换文件或数据

存储卷是定义在Pod资源之上可被其内部的所有容器挂载的共享目录,该目录关联至宿主机或某外部的存储设备之上的存储空间,可由Pod内的多个容器同时挂载使用。Pod存储卷独立于容器自身的文件系统,因而也独立于容器的生命周期,它存储的数据可于容器重启或重建后继续使用,但删除Pod对象时也必将删除其存储卷

存储卷并非Kubernetes上一种独立的API资源类型,它隶属于Pod资源,且与所属的特定Pod对象有着相同的生命周期,因而通过API Server管理声明了存储卷资源的Pod对象时也会相应触发存储卷的管理操作。

目前,Kubernetes支持的存储卷可简单归为以下类别,它们也各自有着不少的实现插件。

1)临时存储卷:emptyDir。

2)本地存储卷:hostPath和local。

3)网络存储卷

云存储——awsElasticBlockStore、gcePersistentDisk、azureDisk和azureFile。

网络文件系统——NFS、GlusterFS、CephFS和Cinder。

网络块设备——iscsi、FC、RBD和vSphereVolume。

网络存储平台——Quobyte、PortworxVolume、StorageOS和ScaleIO。

4)特殊存储卷:Secret、ConfigMap、DownwardAPI和Projected。

5)扩展支持第三方存储的存储接口(Out-of-Tree卷插件):CSI和FlexVolume。

在Pod中定义使用存储卷的配置由两部分组成:一部分通过.spec.volumes字段定义在Pod之上的存储卷列表,它经由特定的存储卷插件并结合特定的存储系统的访问接口进行定义;另一部分是嵌套定义在容器的volumeMounts字段上的存储卷挂载列表,它只能挂载当前Pod对象中定义的存储卷。不过,定义了存储卷的Pod内的容器也可以选择不挂载任何存储卷。

挂载卷的传播模式(mountPropagation)就是用于配置容器将其挂载卷上的数据变动传播给同一Pod中的其他容器,甚至是传播给同一个节点上的其他Pod的一个特性,该字段的可用值包括如下:

None:该挂载卷不支持传播机制,当前容器不向其他容器或Pod传播自己的挂载操作,也不会感知主机后续在该挂载卷或其任何子目录上执行的挂载变动;此为默认值。

HostToContainer:主机向容器的单向传播,即当前容器能感知主机后续对该挂载卷或其任何子目录上执行的挂载变动。

Bidirectional:主机和容器间的双向传播,当前容器创建的存储卷挂载操作会传播给主机及使用了同一存储卷的所有Pod的所有容器,也能感知主机上后续对该挂载卷或其任何子目录上执行的挂载变动;该行为存在破坏主机操作系统的危险,因而仅可用于特权模式下的容器中。