linuxea:kubernetes 简述存储卷类型(18)


大多数有状态的应用都是需要持续存储数据的。容器本身有生命周期,容器终结后,或者编排到其他节点运行,那就意味着数据不能存放在容器内,否则在删除或者容器损坏时数据会丢失

I. 引言

在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在次被调度到被挂载的宿主机且宿主机可用便可用
而外部共享存储只需要支持插件,能够被驱动,并且存储可访问则可用,已经脱离宿主机

II. empryDir

只在节点本地使用。创建一个pod,一个存储卷,pod被删除,存储卷也会被删除.empryDir数据随着pod的创建而创建,随着删除而删除
empryDir可以当临时目录,或者缓存使用(关联宿主机的目录可以是宿主机的内存,将内存放到pod存储卷)。没有持久化

III. hostPath

主机路径,在宿主机创建目录挂载。一定意义的持久性

IV. 网络存储

网络存储设备:san(iscsi),nas(nfs,cifs)
分布式存储:文件系统glusterfs,ceph(rbd),cephfs
云存储:EBS,RDS,Azure Disk

众多的支持类型使用kubectl explain pods.spec.volumes查看,其中persistentVolumeClaim称为持久存储卷请求,简称PVC

V. 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速度较快的金牌存储。这类存储按照性能指标做出分类,大概如下:

0 分享

您可以选择一种方式赞助本站

支付宝扫码赞助

支付宝扫码赞助

日期: 2018-10-08分类: kubernetes

标签: kubernetes

发表评论