首页 > 其他分享 >深入剖析 Kubernetes-4 容器持久化存储

深入剖析 Kubernetes-4 容器持久化存储

时间:2022-11-01 23:48:02浏览次数:50  
标签:容器 存储 Volume PV Kubernetes 宿主机 剖析 PVC StorageClass

1 PV&PVC&StorageClass

1.1 概念

  • PV描述的是持久化存储数据卷。

  • PVC描述的是Pod所希望使用的持久化存储的属性。

  • StorageClass其实就是创建PV的模板。

用户创建的PVC要真正被容器使用起来,必须先和某个符合条件的PV进行绑定。这里要检查的条件包括两部分:

  • PV 和 PVC 的 spec 字段。比如,PV 的存储(storage)大小,就必须满足 PVC 的要求。
  • PV 和 PVC 的 storageClassName 字段必须一样。

PVC 和 PV 的设计,其实跟“面向对象”的思想完全一致

PVC 可以理解为持久化存储的“接口”,它提供了对某种持久化存储的描述,但不提供具体的实现;而这个持久化存储的实现部分则由 PV 负责完成。

在 Kubernetes 中,实际上存在着一个专门处理持久化存储的控制器,叫作 Volume Controller。这个 Volume Controller 维护着多个控制循环,其中有一个循环,扮演的就是撮合 PV 和 PVC 的“红娘”的角色。它的名字叫作 PersistentVolumeController。它会不断地查看当前每一个 PVC,是不是已经处于Bound(已绑定)状态。如果不是,那它就会遍历所有的、可用的 PV,并尝试将其与这个“单身”的 PVC 进行绑定。

将一个 PV 与 PVC 进行“绑定”,其实就是将这个 PV 对象的名字,填在了 PVC 对象的 spec.volumeName 字段上。所以,接下来 Kubernetes 只要获取到这个 PVC 对象,就一定能够找到它所绑定的 PV。

1.2 PV对象如何变成容器里的一个持久化存储

所谓容器的 Volume,其实就是将一个宿主机上的目录,跟一个容器里的目录绑定挂载在了一起。而所谓的“持久化 Volume”,指的就是这个宿主机上的目录,具备“持久性”。而所谓的“持久化 Volume”,指的就是这个宿主机上的目录,具备“持久性”。

Kubernetes 需要做的工作,就是使用远程存储服务,来为容器准备一个持久化的宿主机目录,以供将来进行绑定挂载时使用。

准备“持久化”宿主机目录的过程,我们可以形象地称为“两阶段处理”

  • 第一阶段:Attach

    为虚拟机挂载远程磁盘的操作,对应的正是“两阶段处理”的第一阶段。在Kubernetes 中,我们把这个阶段称为 Attach。

  • 第二阶段:Mount

    将磁盘设备格式化并挂载到 Volume 宿主机目录的操作,对应的正是“两阶段处理”的第二个阶段,我们一般称为:Mount。

注:如果你的 Volume 类型是远程文件存储(比如 NFS)的话,kubelet 的处理过程就会更简单一些。在这种情况下,kubelet 可以跳过“第一阶段”(Attach)的操作,这是因为一般来说,远程文件存储并没有一个“存储设备”需要挂载在宿主机上。kubelet 会直接从“第二阶段”(Mount)开始准备宿主机上的 Volume 目录。

经过了“两阶段处理”,我们就得到了一个“持久化”的 Volume 宿主机目录。所以,接下来,kubelet 只要把这个 Volume 目录通过 CRI 里的 Mounts 参数,传递给Docker,然后就可以为 Pod 里的容器挂载这个“持久化”的 Volume 了。

关于 PV 的“两阶段处理”流程,是靠独立于 kubelet 主控制循环(Kubelet Sync Loop)之外的两个控制循环来实现的

Attach(以及 Dettach)操作,是由 Volume Controller 负责维护的,这个控制循环的名字叫作:AttachDetachController。而它的作用,就是不断地检查每一个 Pod 对应的 PV,和这个 Pod 所在宿主机之间挂载情况。从而决定,是否需要对这个 PV 进行 Attach(或者 Dettach)操作。AttachDetachController是运行在Master节点上的。

Mount(以及 Unmount)操作,必须发生在 Pod 对应的宿主机上,所以它必须是 kubelet 组件的一部分。这个控制循环的名字,叫作:VolumeManagerReconciler,它运行起来之后,是一个独立于 kubelet 主循环的Goroutine。

kubelet 的一个主要设计原则,就是它的主控制循环绝对不可以被 block

1.3 StorageClass

人工管理 PV 的方式就叫作 Static Provisioning。Kubernetes 为我们提供了一套可以自动创建 PV 的机制,即:Dynamic Provisioning。Dynamic Provisioning 机制工作的核心,在于一个名叫 StorageClass 的 API 对象。

StorageClass 对象会定义如下两个部分内容:

  • PV 的属性。比如,存储类型、Volume 的大小等等。
  • 创建这种 PV 需要用到的存储插件。比如,Ceph 等等。

需要注意的是,StorageClass 并不是专门为了 Dynamic Provisioning 而设计的。你可以在PVC和PV中定义相同的即便不存在的StorageClass,Kubernetes 会将他们绑定起来,这个时候进行的是Static Provisioning。

如果你的集群已经开启了名叫 DefaultStorageClass 的 Admission Plugin,它就会为 PVC 和 PV 自动添加一个默认的 StorageClass;否则,PVC 的 storageClassName的值就是“”,这也意味着它只能够跟 storageClassName 也是“”的 PV 进行绑定。

1.4 总结

image-20221101232543771

PVC 描述的,是 Pod 想要使用的持久化存储的属性,比如存储的大小、读写权限等。
PV 描述的,则是一个具体的 Volume 的属性,比如 Volume 的类型、挂载目录、远程存储服务器地址等。
StorageClass 的作用,则是充当 PV 的模板。并且,只有同属于一个 StorageClass的 PV 和 PVC,才可以绑定在一起。

StorageClass 的另一个重要作用,是指定 PV 的 Provisioner(存储插件)。这时候,如果你的存储插件支持 Dynamic Provisioning 的话,Kubernetes 就可以自动为你创建 PV 了。

标签:容器,存储,Volume,PV,Kubernetes,宿主机,剖析,PVC,StorageClass
From: https://www.cnblogs.com/hunter-w/p/16849580.html

相关文章

  • 8-01-剖析业务架构与业务重构实践_ev
                灰度上线:一个一个分别上线,例如先上线1占比相对较低           ......
  • Kubernetes Deployment 实操整理
    Deployment用于部署无状态的服务。一般不直接管理Pod或者ReplicaSet。创建DeploymentDeployment文件apiVersion:apps/v1kind:Deploymentmetadata:name:nginx......
  • Docker容器和宿主机文件互传
    #从容器里面拷文件到宿主机前:容器文件路径后:宿主机路径dockercp容器ID/容器名:容器文件路径宿主机文件路径#从宿主机拷文件到容器里面前:宿主机文件路径后:容......
  • 系统架构与设计(5)- Kubernetes(K8s)
    Kubernetes,也被称为K8s或Kube,是谷歌推出的业界最受欢迎的容器管理/运维工具(容器编排器)。它是一套自动化容器管理/运维的开源平台,包括部署、调度和节点集群的扩展等。使......
  • Docker如何与外界互通(chrono《kubernetes入门实战课》笔记整理)
    Docker与外界互通的三种方式1、拷贝文件dockercp命令,可以直接在主机和容器之间互相拷贝(容器间不可以),格式和cp是一样的,就是注意要标明容器ID,例如:docker cp a.txt 062:......
  • 容器
    1.创建容器方式一:类路径加载配置文件(平时用的那种方式)方式二:文件路径加载配置文件(路径要使用绝对路径)加载多个配置文件tips:无论使用哪种方式都可以加载多个配置文件,文......
  • Docker Hub(chrono《kubernetes入门实战课》笔记整理)
    dockerpull的时候,如果没有明确指定镜像仓库,就会使用默认的“DockerHub”(https://hub.docker.com/),是docker公司官方搭建的服务。【如何在DockerHub上挑选镜像】docker......
  • 苹果app上架流程之傻瓜式教程剖析
    iOS开发者开发好一款APP之后,进行内测后没问题,下一步就是要上架AppStore了,一些开发者不知道该如何上架AppStore,下面,我们来说说iOS上架流程,以及如何快速上架AppStore。工具1.i......
  • Dockerfile(chrono《kubernetes入门实战课》笔记整理)
    【容器分层】每个镜像都是基于一些已有的系统,资源等组合起来的,假设N个镜像都是基于centos7.0系统,如果是直接打包做镜像,就会需要打包N份centos7系统,这对磁盘存储和网络传输......
  • Docker容器监控之CAdvisor+InfluxDB+Granfana
    1、创建目录#mkdircig2、新建docker-composevidocker-compose.ymlversion:'3.1'volumes:grafana_data:{}services:influxdb:image:tut......