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 的所有容器,也能感知主机上后续对该挂载卷或其任何子目录上执行的挂载变动;该行为存在破坏主机操作系统的危险,因而仅可用于特权模式下的容器中。
版权声明: 本文为 InfoQ 作者【穿过生命散发芬芳】的原创文章。
原文链接:【http://xie.infoq.cn/article/25e5e1b6af18040a04d50cce8】。文章转载请联系作者。
评论