应用程序在处理请求时,可以根据当前请求的处理是否受影响于此前的废物请求,将应用划分为无状态应用和有状态应用。在微服务体系中,各种应用均被拆解成了众多的微服务,其中也包括许多有状态的应用,而对于有状态的应用来说,数据持久化几乎是必然之需。
kubernetes提供的存储卷(volume)属于Pod级别,共享于Pod内的所有容器。可以用于在容器的文件系统之外存储应用程序的相关数据,甚至还可以独立于Pod的生命周期之外实现数据持久化。(简单的来说,kubernetes种存储卷是定义在Pod资源之上、可被其内部的说有容器挂在的共享目录,它关联至外部的存储设备之上的存储空间,从而独立于容器自身的文件系统,而数据是否具有持久的存储能力取决于存储卷自身是否支持持久存储机制。)
kubernetes支持非常丰富的存储类型,包括本地存储(节点存储)、网络存储系统中的众多存储机制,甚至还支持srcret和ConfigMap这样特殊的存储资源。
对于Pod来说,卷类型的存储是为了关联相关的存储系统时提供相关的配置参数,例如:关联节点本地的存储目录于关联GlusterFS存储系统所需的配置参数差异巨大,因此指定存储类型时也就限定了其关联的后端存储设备。
目前Kubernetes支持的存储卷包括以下几种:
上述的存储类型中,emptyDir和hostPath属于节点级别的存储类型,emptyDir的生命周期与Pod资源相同,而是用hostPath卷的Pod一旦被重新调度到其它节点,那么它将再也无法使用此前的数据。因此,这两种类型都不具有持久性。想要使用持久类型的存储卷,就需要使用网络存储系统,例如:NFS、Ceph、GlusterFS等。或者云端存储gce、aws等。
然而网络存储系统通常都不太容易使用,有的甚至很复杂,为此k8s专门设计了一种集群级别的资源------PV,它借由系统管理员配置存储系统,而后由用户通过PVC存储卷直接申请使用。大大简化了终端存储用户的配置过程,有效降低了存储难度。
Secret和ConfigMap算的上两种特殊的卷类型
1)Secret用于向Pod传输敏感信息,如密码、私钥、证书文件等,这些信息如果直接定义在镜像中很容易泄露,有了Secert资源,用户可以将这些信息存储与集群中而后由Pod进行挂载,从而实现将敏感数据与系统数据的解耦。
2)ConfigMap资源用于向Pod中注入非敏感数据,使用时,用户可以将数据直接存储于ConfigMap配置文件中,而后直接在Pod中使用ConfigMap卷引用它即可,可以帮助实现容器配置文件的集中化定义和管理。
在1.9版本中,kubernetes对存储支持做了进一步的提升,引入了容器存储接口CSI的一套alpha实现版本,其能够将插件的安装流程简化至与创建Pod相当,并允许第三方供应商无需再修改Kubernetes代码库的情况下提供自己的解决方案。
临时存储
emptyDir
emptyDir存储卷是Pod生命周期中的一个临时文件,类似于Docker上的”docker挂在卷“,在Pod对象启动时即被创建,而在Pod对象被移除时也会一并删除。不具有持久存储的能力。
emptyDir只能用于某些特殊的场景当中,例如同一Pod内的多个容器间文件的共享,或者作为容器数据的临时存储目录用于数据缓存等
gitRepo
将指定git仓库挂载到本地,但不能实现数据同步,在1.12版本中被弃用
节点存储
hostPath
将节点上某个文件系统或文件挂载到Pod中的一种存储空间,可独立于Pod资源的生命周期,具有持久性。但它是工作节点本地的存储空间,仅适合特定情况下的存储需求,例如:某些Pod资源通常受控于daemonset类型的Pod控制器,它运行于集群中的每个工作节点之上,负责收集工作节点上系统级的相关数据,因此使用hostPath存储卷也是理所应当的。(日志收集、信息采集、缓存redis)
网络存储
NFS
RBD
GlusterFS
Cinder
来源:CSDN
作者:awen Li
链接:https://blog.csdn.net/weixin_44666068/article/details/103459407