大多数有状态的应用都是需要持续存储数据的。容器本身有生命周期,容器终结后,或者编排到其他节点运行,那就意味着数据不能存放在容器内,否则在删除或者容器损坏时数据会丢失
引言
在k8s中,pod一直运行在机器上,除非机器宕机pod才会被调度到其他机器,顶多重启。一旦这个pod被删除(故障),或者机器宕机(被编排到其他节点),这个pod就会重构。如果数据存放在pod的名称空间中,数据随着pod的终结而消失了。为了突破这种现状,就需要将数据放在pod之外的地方
- 在docker中可以使用-v将本地目录挂载到容器内,在删除容器后在up容器,数据是不会随着容器删除而丢失,在一定的意义上实现数据持久存储(如果节点挂了,也会随着本地宿主机终结而终结)。当然,这种方式不适用于在kubernetes上。
kubernetes提供了专门应用不同类型的存储卷:持久,半持久,没有持久
对k8s来讲存储卷不属于容器,属于pod,我们能够在容器内挂载。
-
在pod中是有一个基础容器,不过他并不启动,是依靠一个镜像来完成。在Kubernetes中,每个pod都有一个IP,在一个pod中有一个所谓的基础架构容器,它是Kubelet实例化的第一个容器,它获取pod的IP并设置网络命名空间。然后,pod中的所有其他容器都加入infra容器的网络和IPC命名空间。infra容器启用了网桥模式,并且pod中的所有其他容器通过容器模式共享其命名空间。在infra容器中运行的初始进程实际上没有任何效果,因为它的唯一目的是充当命名空间的主页。
也就说,所有pod网络名称空间都是由他分配的,如下:
k8s.gcr.io/pause 3.1 da86e6ba6ca1 9 months ago 742kB
在pod中运行的主容器也是共享k8s.gcr.io/pause
的网络名称空间。容器要挂载他的存储卷也是挂载(复制)k8s.gcr.io/pause
的存储卷,这也是基础架构容器。
那么,同一个pod内的所有容器共享pause容器的网络名称空间,这也就是为什么同一个pause能够使用同一个地址共享同一个tcp/ip协议栈,使用同一组主机名的原因。
pod中的存储卷也就是基础架构容器的存储卷,而容器的存储卷只不过是容器目录与宿主机目录建立的关联关系,如果宿主机目录就是宿主机本地的,那么也会随着宿主机的终结而终结。因此,宿主机的目录,如果要真正实现持久性,宿主机的目录必然是挂载的外部存储设备。如下:pod内的数据会随着pod的创建和删除而消失挂载到宿主机的数据只要pod在次被调度到被挂载的宿主机且宿主机可用便可用而外部共享存储只需要支持插件,能够被驱动,并且存储可访问则可用,已经脱离宿主机
empryDir
只在节点本地使用。创建一个pod,一个存储卷,pod被删除,存储卷也会被删除.empryDir数据随着pod的创建而创建,随着删除而删除empryDir可以当临时目录,或者缓存使用(关联宿主机的目录可以是宿主机的内存,将内存放到pod存储卷)。没有持久化
hostPath
主机路径,在宿主机创建目录挂载。一定意义的持久性
网络存储
网络存储设备:san(iscsi),nas(nfs,cifs)分布式存储:文件系统glusterfs,ceph(rbd),cephfs云存储:EBS,RDS,Azure Disk
众多的支持类型使用 kubectl explain pods.spec.volumes
查看,其中persistentVolumeClaim
称为持久存储卷请求,简称PVC
pvc
当用户使用k8s创建pod,为了实现持久存储,就需要定义存储卷。其中需要定义认证信息,地址,文件系统配置等等,然而这些信息的定制需要更专业的存储水准才能够更好的使用k8s做持久存储。为了降低这种需求,则可以使用pvc(当需要创建存储卷,就发送创建请求,不关注使用什么存储,只关注存储空间,存储及服务)。
容器挂载存储卷,pvc与pvc建立关联关系,pvc与pv建立关联关系,pv与存储建立关联关系。如下A:当创建一个pod,并定义的存储卷类型为pvc,pvc则会关联到pod所在的"名称空间",在此名称空间(pvc)中查找已存在的pvc资源,此关联只是申请(当pod申请后就会在pod所在的名称空间创建此pvc,这个pvc要能够存储需要与pv建立关联关系)。申请信息将会关联到pv上,要能够真正能够存储需要与pv建立关联关系。pv是存储系统之上的一段存储空间。上图A所示
但是,对于pv来讲,我们并不清楚pod什么时候需要创建pvc,也不知道创建的容量。我们可以人为通知创建。但是在云环境中,要做到按需创建就需要将存储空间抽象成存储类,存储类是单独的层。当创建时就会请求申请到存储类,存储类生成符合请求的pv,并且使二者建立关联关系。这类pv由用户的请求触发而动态生成,就称为动态供给。上图B所示
这依赖于存储类,而存储类分为很多级别:较慢的铜牌存储,中等的银牌存储,ssd速度较快的金牌存储。这类存储按照性能指标做出分类,大概如下: