当前位置:网站首页 > C++编程 > 正文

kubelet 作用(kubelet csi)



更多 k8s CSI 的分析,可以查看这篇博客kubernetes ceph-csi分析,以 ceph-csi 为例,做了详细的源码分析。

kubernetes的设计初衷是支持可插拔架构,从而利于扩展的功能。在此架构思想下,提供了3个特定功能的接口,分别是容器网络接口、容器运行时接口和容器存储接口。通过调用这几个接口,来完成相应的功能。

下面我们来对容器存储接口来做一下介绍与分析。

在本文中,会对是什么、为什么要有、系统架构做一下介绍,然后对所涉及的对象与组件进行了简单的介绍,以及对存储进行相关操作的流程分析,存储相关操作包括了存储创建、存储扩容、存储挂载、解除存储挂载以及存储删除操作。

CSI是什么

CSI是(容器存储接口)的简写。

CSI的目的是定义行业标准“容器存储接口”,使存储供应商(SP)能够开发一个符合CSI标准的插件并使其可以在多个容器编排(CO)系统中工作。CO包括, , 等。

kubernetes将通过接口来跟第三方存储厂商进行通信,来操作存储,从而提供容器存储服务。

为什么要有CSI

其实在没有之前就已经提供了强大的存储卷插件系统,但是这些插件系统实现是代码的一部分,需要随组件二进制文件一起发布,这样就会存在一些问题。

基于以上问题,将存储体系抽象出了外部存储组件接口即,通过接口与第三方存储厂商的存储卷插件系统进行通信。

这样一来,对于第三方存储厂商来说,既可以单独发布和部署自己的存储插件,进行正常迭代,而又无需接触核心代码,降低了开发的复杂度。同时,对于来说,这样不仅降低了自身的维护成本,还能为用户提供更多的存储选项。

CSI系统架构

这是一张k8s csi的系统架构图,图中所画的组件以及k8s对象,接下来会一一进行分析。

CSI相关组件一般采用容器化部署,减少环境依赖。

持久存储卷,集群级别资源,代表了存储卷资源,记录了该存储卷资源的相关信息。

回收策略

(1)retain:保留策略,当删除pvc的时候,保留pv与外部存储资源。

(2)delete:删除策略,当与pv绑定的pvc被删除的时候,会从k8s集群中删除pv对象,并执行外部存储资源的删除操作。

(3)resycle(已废弃)

pv状态迁移

available --> bound --> released

持久存储卷声明,namespace级别资源,代表了用户对于存储卷的使用需求声明。

示例:

 
  
pvc状态迁移

pending --> bound

定义了创建pv的模板信息,集群级别资源,用于动态创建pv。

示例:

 
  

VolumeAttachment 记录了pv的相关挂载信息,如挂载到哪个node节点,由哪个volume plugin来挂载等。

AD Controller 创建一个 VolumeAttachment,而 External-attacher 则通过观察该 VolumeAttachment,根据其状态属性来进行存储的挂载和卸载操作。

示例:

 
  

CSINode 记录了csi plugin的相关信息(如nodeId、driverName、拓扑信息等)。

当Node Driver Registrar向kubelet注册一个csi plugin后,会创建(或更新)一个CSINode对象,记录csi plugin的相关信息。

示例:

 
  

下面来介绍下涉及的组件与作用。

扩展各种存储类型的卷的管理能力,实现第三方存储的各种操作能力与k8s存储系统的结合。调用第三方存储的接口或命令,从而提供数据卷的创建/删除、attach/detach、mount/umount的具体操作实现,可以认为是第三方存储的代理人。前面分析组件中的对于数据卷的创建/删除、attach/detach、mount/umount操作,全是调用volume plugin来完成。

根据源码所在位置,volume plugin分为in-tree与out-of-tree。

in-tree

在k8s源码内部实现,和k8s一起发布、管理,更新迭代慢、灵活性差。

out-of-tree

代码独立于k8s,由存储厂商实现,有csi、flexvolume两种实现。

csi plugin

csi plugin分为ControllerServer与NodeServer,各负责不同的存储操作。

external plugin

external plugin包括了external-provisioner、external-attacher、external-resizer、external-snapshotter等,external plugin辅助csi plugin组件,共同完成了存储相关操作。external plugin负责watch pvc、volumeAttachment等对象,然后调用volume plugin来完成存储的相关操作。如external-provisioner watch pvc对象,然后调用csi plugin来创建存储,最后创建pv对象;external-attacher watch volumeAttachment对象,然后调用csi plugin来做attach/dettach操作;external-resizer watch pvc对象,然后调用csi plugin来做存储的扩容操作等。

Node-Driver-Registrar

Node-Driver-Registrar组件负责实现csi plugin(NodeServer)的注册,让kubelet感知csi plugin的存在。

组件部署方式

csi plugin controllerServer与external plugin作为容器,使用deployment部署,多副本可实现高可用;而csi plugin NodeServer与Node-Driver-Registrar作为容器,使用daemonset部署,即每个node节点都有。

PV controller

负责pv、pvc的绑定与生命周期管理(如创建/删除底层存储,创建/删除pv对象,pv与pvc对象的状态变更)。

(1)in-tree:创建/删除底层存储、创建/删除pv对象的操作,由PV controller调用volume plugin(in-tree)来完成。

(2)out-tree CSI:创建/删除底层存储、创建/删除pv对象的操作由external-provisioner与csi plugin共同来完成。

AD controller

AD Cotroller全称Attachment/Detachment 控制器,主要负责创建、删除VolumeAttachment对象,并调用volume plugin来做存储设备的Attach/Detach操作(将数据卷挂载到特定node节点上/从特定node节点上解除挂载),以及更新node.Status.VolumesAttached等。

不同的volume plugin的Attach/Detach操作逻辑有所不同,对于csi plugin(out-tree volume plugin)来说,AD controller的Attach/Detach操作只是修改VolumeAttachment对象的状态,而不会真正的将数据卷挂载到节点/从节点上解除挂载,真正的节点存储挂载/解除挂载操作由kubelet中volume manager调用csi plugin来完成。

volume manager

主要是管理卷的Attach/Detach(与AD controller作用相同,通过kubelet启动参数控制哪个组件来做该操作)、mount/umount等操作。

对于csi来说,volume manager的Attach/Detach操作只创建/删除VolumeAttachment对象,而不会真正的将数据卷挂载到节点/从节点上解除挂载;csi-attacer组件也不会做挂载/解除挂载操作,只是更新VolumeAttachment对象,真正的节点存储挂载/解除挂载操作由kubelet中volume manager调用调用csi plugin来完成。

先来看下kubernetes通过in-tree volume plugin来创建与挂载volume的流程

再来看下kubernetes通过out-of-tree volume plugin来创建与挂载volume的流程,以csi-plugin为例。

下面来看下通过来创建/删除、挂载/解除挂载ceph存储的流程。

1. 存储创建

流程图

流程分析

(1)用户创建对象;

(2)监听对象,寻找现存的合适的对象,与对象绑定。当找不到现存合适的对象时,将更新对象,添加:,让组件开始开始创建存储与对象的操作;当找到时,将与绑定,结束操作。

(3)组件监听到的新增事件,判断的:的值,即判断是否是自己来负责做创建操作,是则调用组件进行存储的创建;

(4)组件调用ceph创建底层存储;

(5)底层存储创建完成后,根据存储信息,拼接对象,创建对象(这里的对象使用了提前绑定特性,将信息填入了对象的属性);

(6)监听对象,将第(5)步创建的对象,与对象绑定。

2. 存储扩容

流程图

流程分析

(1)修改对象,修改申请存储大小();

(2)修改成功后,监听到该的事件,发现比大,于是调组件进行 controller端扩容;

(3)组件调用ceph存储,进行底层存储扩容;

(4)底层存储扩容完成后,组件更新对象的的值为扩容后的存储大小;

(5)的在调谐过程中发现大于,于是调组件进行 node端扩容;

(6)组件对node上存储对应的文件系统扩容;

(7)扩容完成后,更新的值为扩容后的存储大小。

3. 存储挂载

流程图

kubelet启动参数,该启动参数设置为 表示启用 进行 操作,同时禁用 执行 操作(默认值为 )。实际上 操作就是创建/删除对象。

流程分析

(1)用户创建一个挂载了的;

(2)或中的发现有未执行操作,于是进行操作,即创建对象;

(3)组件 对象,更新;

(4)更新对象的属性值,将该记为;

(5)中的获取属性值,发现已被标记为;

(6)于是中的调用组件的与完成存储的挂载。

4. 解除存储挂载

流程图
流程分析

(1)用户删除声明了的;

(2)或中的发现有未执行操作,于是进行操作,即删除对象;

(3)或等待对象删除成功;

(4)更新对象的属性值,将标记为的该从属性值中去除;

(5)中的获取属性值,找不到相关的信息;

(6)于是中的调用组件的与完成存储的解除挂载操作。

5. 删除存储

流程图

流程分析

(1)用户删除对象;

(2)发现与绑定的对象被删除,于是更新的状态为;

(3) watch到更新事件,并检查的状态是否为,以及回收策略是否为;

(4)确认了对象的状态以及回收策略之后,接下来组件会调用的来删除存储;

(5)组件的方法,调用ceph集群命令,删除底层存储;

(6)删除底层存储后,组件删除对象。

CSI即(容器存储接口)。

为了解决第三方存储厂商的存储卷插件代码集成到kubernetes代码中所带来的各种问题,将存储体系抽象出了外部存储组件接口即,通过接口与第三方存储厂商的存储卷插件系统进行通信,来操作存储,从而提供容器存储服务。

这样一来,对于第三方存储厂商来说,既可以单独发布和部署自己的存储插件,进行正常迭代,而又无需接触核心代码,降低了开发的复杂度。同时,对于来说,这样不仅降低了自身的维护成本,还能为用户提供更多的存储选项。

更多 k8s CSI 的分析,可以查看这篇博客kubernetes ceph-csi分析,以 ceph-csi 为例,做了详细的源码分析。

关联博客:kubernetes/k8s CRI分析-容器运行时接口分析

到此这篇kubelet 作用(kubelet csi)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • tcp协议工具(tcping工具)2025-11-20 16:27:09
  • console线怎么接(console线怎么接电脑)2025-11-20 16:27:09
  • acl权限模型(acl权限的作用)2025-11-20 16:27:09
  • c++ 条件变量 wait(c++ 条件变量signal)2025-11-20 16:27:09
  • con1是什么意思(con 什么意思)2025-11-20 16:27:09
  • console接口是干嘛的(交换机的console连接线)2025-11-20 16:27:09
  • 消息认证码(消息认证码mac值)2025-11-20 16:27:09
  • aulopoce是什么品牌(auopn什么牌子)2025-11-20 16:27:09
  • pcp文件是什么意思(pcd文件是什么意思)2025-11-20 16:27:09
  • 2258xt开卡设置(2258XT开卡设置QLC)2025-11-20 16:27:09
  • 全屏图片