K8s存储架构及插件使用

网站建设3年前发布
55 0 0

作者 | 中国移动云能力中心PaaS产品部 王琦,容器内部存储的生命周期是短暂的,会随着容器环境的销毁而销毁,具有不稳定性。如果多个容器希望共享同⼀份存储,则仅仅依赖容器本身是很难实现的。,在Kubernetes系统中,容器应用所需的存储资源被抽象为存储卷(Volume),并以此概念来解决“容器存储所面临”的问题。,Volume是与Pod绑定的(独立于容器)与Pod具有相同生命周期的资源对象。我们可以将Volume的内容理解为⽬录或⽂件,容器如需使⽤某个Volume,则仅需设置volumeMounts将⼀个或多个Volume挂载为容器中的⽬录或⽂件,即可访问Volume中的数据。Volume具体是什么类型,以及由哪个系统提供,对容器应⽤来说是透明的。,Kubernetes⽬前⽀持的Volume类型包括Kubernetes的内部资源对象类型(In-Tree)、开源共享存储等(Out-of-Tree)类型的存储服务。,PV(Persistent Volume):存储资源的定义,主要涉及存储能力、访问模式、存储类型、回收策略、后端存储类型等关键信息的设置;,图 PV状态流程,PVC(Persistent Volume Claim):用户对存储资源的需求申请,主要涉及存储空间请求、访问模式、PV选择条件和存储类别等信息的设置;,图PVC状态流程,SC(Storage Class):存储资源的抽象定义,对用户设置的PVC申请屏蔽后端存储的细节,一方面减少了用户对于存储资源细节的关注,另一方面减轻了管理员手工管理PV的压力,转由系统自动完成PV的创建和绑定,实现动态的资源供应。SC资源对象的定义主要包括名称、后端存储的提供者及相关参数配置和回收策略。,图 Kubernetes存储架构,图 Kubernetes持久化存储流程,1)Provision/Delete阶段:,用户创建一个包含PVC的Pod;,PV Controller通过持续监听ApiServer,发现PVC处于待绑定的状态,随即调用Volume Plugin创建存储卷,并在创建成功后将PV与PVC进行绑定;,2)Attach/Detach阶段:,3)Mount/Unmount阶段:,Kubernetes在默认情况下提供了主流的存储卷接入方案,可通过命令“kubectl explain pod.spec.volumes”查看Pod支持的所有存储卷。同时,也提供了一种基于插件的存储管理机制,根据概述可知PV Controller、AD Controller和Volume Manager均通过调用Volume Plugin的功能接口去执行存储卷管理相关Provision、Attach操作。因此,操作的具体实现其实都取决于插件中的接口逻辑。Volume Plugin可以允许除默认类型外的其他存储服务接入到Kubernetes系统中,主要分为In-Tree和Out-of-Tree两类:,在Kubernetes中,存储插件的开发方式有Flexvolume和CSI两种,接下来通过原理和案例演示的方式做进一步介绍。,Flexvolume提供了一种扩展Volume Plugin的方式,用户可以自定义自己的存储插件,实现Attach、Mount等功能接口。比如AD Controller调用插件实现Attach操作时,会首先调用Flexvolume中的Attach接口。Flexvolume是可被Kubelet驱动的可执行二进制文件,该文件需要实现Flexvolume的相关接口,每一次调用相当于执行一次shell脚本,然后返回JSON格式的数据,因此其不是一个常驻内存的守护进程。Flexvolume存储插件默认的存放位置是:/usr/libexec/kubernetes/kubelet-plugins/volume/exec/<vendor~driver>/<driver>,Volume plugin组件会不断watch这个目录来实现插件提供的增删等功能。其中,vendor~driver的名字和Pod中flexVolume.driver的字段名相对应,vendor部分可自定义。,Flexvolume接口可以根据需求自定义的实现,比如使用NFS文件存储,因为不存在存储卷的挂接操作,因此不需要实现Attach、Detach相关接口,只需将接口返回结果定义成{"status":"Not supported","message":"error message"} 即可。以下列举Flexvolume部分接口:,演示前提条件:Kubernetes集群已具备NFS存储服务,并且NFS共享目录已设置,jq工具已安装。,演示案例使用Kubernetes官方给出的一个基于NFS文件存储的Flexvolume插件示例,脚本链接:https://github.com/kubernetes/examples/blob/master/staging/volumes/flexvolume/nfs。根据下图所示,在Flexvolume存储插件默认的存放位置新建插件目录wq-nfs,将脚本放置目录下,并赋予文件可执行权限。,然后部署一个Pod到指定节点,并使用Flexvolume的方式对容器中的数据进行持久化存储,详细yaml文件内容如下。,通过查看Pod本地持久化目录是否已被挂载到了NFS存储系统上,可以得知Flexvolume插件是否正常运行。在NFS共享目录下新建文本文件,并写入一些内容,然后进入Pod查看新建文件和写入内容是否已同步,即可进一步验证存储是否挂载成功,详细操作如下图所示。,CSI是容器存储接口Container Storage Interface的简称,作用是为了能在容器编排引擎和存储系统之间建立一套标准的存储调用接口,进而通过该接口为容器编排引擎提供存储服务。,图 CSI插件设计架构,CSI存储体系主要由两部分组成:External Components和Custom Components。,External Components(Kubernetes外部组件):主要包含Driver Registrar、External Attacher、External Provisioner三个部分,这三个组件源自Kubernetes原本的in-tree存储体系,可以理解为Kubernetes的一个外部Controller,负责Watch Kubernetes的API资源对象,然后根据监听到的状态调用Custom Components实现存储管理和操作。,注:External Components目前仍由Kubernetes团队维护,插件开发者无需关心其实现细节。,Custom Components(CSI存储插件):主要包含CSI Identity、CSI Controller、CSI Node三个部分,是需要开发者通过编码来实现的,并以gRPC的方式对外提供服务。,演示前提条件:Kubernetes集群中已安装NFS相关的CSI驱动,用于实践通过CSI的方式使用NFS文件存储。Kubernetes官方有一个基于CSI驱动实现NFS存储的项目可以用于初次实践,链接如下:https://github.com/kubernetes-csi/csi-driver-nfs,同时提供以下两种安装部署方式。​,​运行脚本后,可通过命令”kubectl -n kube-system get pod -o wide -l app=csi-nfs-controller”和”kubectl -n kube-system get pod -o wide -l app=csi-nfs-node”查看Pod状态,如下所示则表示已安装完毕。可以注意到,csi-nfs-node会以DaemonSet的方式在每个节点上运行,并执行存储卷的Mount/Unmount操作。,csi-driver-nfs安装完成后,就可以通过”spec.csi.driver”的规范来调用驱动使用NFS存储。下面我们先通过Static Volume Provisioning,也就是静态PV的供应方式调用CSI驱动创建PV。然后通过PVC使用这个PV,完成PVC和PV的绑定操作。,实际操作过程如下图所示。可以看到,通过CSI驱动,PV创建成功并已处于可使用的状态。此时,便可通过PVC使用这个PV,PVC在创建后会与PV进行绑定,绑定成功后PV的状态也会发生改变。,接下来,我们再通过Dynamic Volume Provisioning,动态PV的供应方式做进一步的演示。该方式相比Static Volume Provisioning,集群管理员无需再预先分配PV,而只是创建一个SC模板文件,用户在通过PVC使用PV时,无需再关心PV所需的参数细节,因为这些信息已经预先设置到了SC里。​,实际操作过程如下图所示。可以看到,SC、PVC创建成功,PVC通过SC调用CSI驱动自动生成了PV(pvc-4c45d45b-ec52-4276-9cbd-589964da73b3),并最终与PVC完成了绑定。,本文介绍了Kubernetes存储架构及插件的使用,主要包括以下三部分内容:,

© 版权声明

相关文章