在Docker中,文件系统与Docker容器具有相同的生命周期。在多节点运行Docker的环境中,应用会因为各种原因而退出。于是在多节点中运行的容器就面临着一种境况,如某个容器崩溃、节点崩溃、用户误删除而导致容器被删除。若我们直接将数据存在容器内的文件系统上数据也将丢失,为了避免数据与容器产生直接绑定关系,我们应该将其数据存储在容器文件系统之外,而存储方式则是为容器引入外部的存储空间。

外部存储分类

外部的存储空间分为两类:

  • Host:宿主机级别,在节点本地进行存储。
  • Network Storage:网络存储

对于Host类型的存储来说,若在其节点上运行的容器崩溃了,再次启动容器时,只能在同一个节点上进行复,而对于集群环境的k8s来说这种类型的存储不适用。因此使用网络存储更加合适。

共享式存储设备

共享式存储设备分为:

  • 多路并行读写
  • 多路只读
  • 单路读写

pod使用Volume步骤

  1. 在Pod上定义存储卷,并关联到目标存储服务上
  2. 在需要用到存储卷的容器上挂载其所属的Pod的存储卷
pod中使用volume的资源清单格式
1
2
3
4
5
6
7
8
9
10
11
12
13
spec:
volumes:
- name <string> # 存储卷名称标识,仅可使用DNS标签格式的字符,在当前Pod中必须唯一
VOL_TYPE <Object> # 存储卷类型。存储卷插件及具体的目标存储供给方的相关配置
containers:
- name: …
image: …
volumeMounts:
- name <string> # 要挂载的存储卷的名称,必须匹配存储卷列表中某项的定义
mountPath <string> # 容器文件系统上的挂载点路径
readOnly <boolean> # 是否挂载为只读模式,默认为“否”
subPath <string> # 挂载存储卷上的一个子目录至指定的挂载点
subPathExpr <string> # 挂载由指定的模式匹配到的存储卷的文件或目录至挂载点

VOL_TYPE 存储卷类型

存储卷指的是pod外部某个存储空间,而要想访问存储空间通常需要在节点上能适配到存储空间,也就是所谓的驱动程序。

管理存储卷的功能是kubelet实现的,在kubelet中实现此功能的位置叫做Volume Plugin,也叫做卷类型。

卷插件分为以下几种类型:

  • Host级别:hostPath、Local
  • 网络级别:NFS、GlusterFS、rbd(块设备)、CephFS(文件系统)、OSS(aliyun)
  • 临时存储:emptyDir(空目录,将内存空间作为存储使用)

对于任何一种存储卷都需要,kubelet通过Volume Plugin的支持才能实现。

如果Volume Plugin无法支持,也想让其能被使用则需要借助一种特殊形式CSI来使用

CSI(Container Storage Interface)

CSI容器存储接口,一旦借助于CSI来实现,就意味任何存储服务商可以自己开发一个专用的外部存储插件,通过CSI对接到kubelet之上,如此其扩展能力就强大了,任何服务商都能提供。

目前来说有很多服务都能被CSI所对接,如Longhorn、