pod本身具有生命周期,故其内部运行的容器及其相关数据自身均无法持久存在。docker支持配置容器使用存储卷将数据持久存储于容器自身文件系统之外的存储空间中,它们可以是节点文件系统或网络文件系统之上的存储空间。相应地,k8s也支持类似地存储卷功能,不过,其存储卷是与pod资源绑定而非容器。简单来说,存储卷是定义在pod资源之上、可被其内部的所有容器挂载的共享目录,它关联至某外部的存储设备之上的存储空间,从而独立于容器自身的文件系统,而数据是否具有持久能力则取决于存储卷自身是否支持持久机制。
1、支持的存储卷类型
k8s支持非常多的存储卷类型,包括本地存储和网络存储系统中的诸多存储机制以及secret和configMap资源。对于pod来说,卷类型主要是为关联相关的存储系统时提供相关的配置参数。emptyDir与hostPath属于节点级别的卷类型,emptyDir的生命周期与pod资源相同,而使用了hostPath卷的pod一旦被重新调度至其他节点,那么它将无法再使用此前的数据,因此,这两种类型都不具有持久性。要想使用持久类型的存储卷,就得使用网络存储系统,如nfs、ceph、glusterfs等,或者云端存储。k8s专门为网络存储系统设计了一种集群级别的资源PersisitentVolume,配置存储系统而后通过persistentVolumeClaim存储卷直接申请使用的机制大大简化了终端存储用户的配置过程,有效降低了使用难度。
1)、secret用于向pod中传递敏感信息,如密码、私钥、证书文件等,这些信息如果直接定义在镜像中很容易导致泄露。有了secret资源,用户可以将这些信息存储于集群中而后由pod进行挂载,从而实现将敏感数据与系统解耦。
2)、ConfigMap资源则用于向pod注入非敏感数据,使用时,用户将数据直接存储于configMap中,而后直接在pod中使用configmap卷引用即可,它可以帮助实现容器配置文件集中化定义和管理。
2、存储卷的使用方式
在pod中定义使用存储卷的配置由两部分组成:一是通过spec.volumes字段定义在pod之上的存储卷列表,其支持使用多种不同类型的存储卷切配置参数差别很大;