Controller-runtime框架

Controller-runtime是社区提供的用于开发Controller的框架,包含了各种已封装的代码库。Kubebuilder与Operator SDK都是基于Controller-runtime框架来工作的,使用Controller-runtime,开发者可以方便地开发各种Controller、CRD、Admission WebHook等

主要模块

Controller-runtime为Controller的开发提供了各种功能模块,每个模块中包括了一个或多个实现,通过这些模块,开发者可以灵活地构建自己的Controller,主要包括以下内容。

(1)Client:用于读写Kubernetes资源对象的客户端

(2)Cache: 本地缓存,用于保存需要监听的Kubernetes资源。缓存提供了只读客户端,用于从缓存中读取对象。缓存还可以注册处理方法(EventHandler),以响应更新的事件。

(3)Manager:用于控制多个Controller,提供Controller共用的依赖项,如Client、Cache、Schemes等。通过调用Manager.Start方法,可以启动Controller。

(4)Controller:控制器,响应事件(Kubenetes资源对象的创建、更新、删除)并确保对象规范(Spec字段)中指定的状态与系统状态匹配,如果不匹配,则控制器需要根据事件的对象,通过协调器(Reconciler)进行同步。在实现上,Controller是用于处理reconcile.Requests的工作队列,reconcile.Requests包含了需要匹配状态的资源对象。

  1. Controller需要提供Reconciler处理从工作队列中获取的请求。
  2. Controller需要配置相应的资源监听,根据监听到的Event生成reconcile.Requests并加入队列。

(5)Reconciler:为Controller提供同步的功能,Controller可以随时通过资源对象的Name和Namespace来调用Reconciler,调用时,Reconciler将确保系统状态与资源对象所表示的状态匹配。例如,当某个RelicaSet的副本数为5,但系统中只有3个Pod时,同步ReplicaSet资源的Reconciler需要新建两个Pod,并将它们的OwnerReference字段指向对应的ReplicaSet。

  1. Reconciler包含了Controller所有业务逻辑。
  2. Reconciler通常只处理单个对象类型,例如只处理ReplicaSets的Reconciler,不处理其它的对象类型。如果需要处理多种类型,需要实现多个Controller。如果你希望通过其他类型来触发Reconciler,例如,通过Pod对象的事件来触发ReplicaSet的Recon-ciler,则可以提供一个映射,通过该映射将触发Reconciler的类型映射到需要匹配的类型。
  3. 提供给Reconciler的参数是需要匹配的资源对象的Name和Namespace。
  4. Reconciler不关心触发它的事件的内容和类型。例如,对于同步ReplicaSet资源的Reconciler来说,触发它的是ReplicaSet的创建还是更新并不重要,Reconciler总会比较系统中相应的Pod数量和ReplicaSet中指定的副本数量。

(6)WebHook:准入WebHook(Admission WebHook)是扩展Kubernetes API的一种机制,WebHook可以根据事件类型进行匹配,比如资源对象的创建、删除、更改等事件,当配置的事件发生时,Kubernetes的APIServer会向WebHook发送准入请求处理结果响应给APIServer。准入WebHook分两种类型:变更(Mutaing)准入和验证准入。变更准入用于在APIServer进行准入验证前,更改请求中的CRD或核心API资源。验证准入用于验证请求中的对象是否满足某些请求。

准入WebHook要求提供处理方法(Handler)来处理接收到的AdmissionRequests。

(7)Source:resource。Source是Controller.Watch的参数,提供事件,事件通常是来自Kubernetes的APIServer(如Pod创建、更新和删除)。例如,source.Kind使用指定对象(通过GroupVersionKind指定)的Kubernetes API  Watch接口来提供此对象的创建、更新、删除事件。

  1. Source通过Watch API提供Kubernetes指定对象的事件流。
  2. 建议开发者使用Controller-runtime中已有Source实现,而不是自己实现此接口。

(8)EventHandler:handler.Eventhandler是Controller.Watch参数,用于将事件对应的reconcile.Requests加入队列。例如,从Source中接收到一个Pod的创建事件,eventhandler.EnqueueHandler会根据Pod的Name与Namespace生成reconcile.Requests后,加入队列。

  1. EventHandlers处理事件的方式是将一个或多个reconcile.Requests加入队列。
  2. 在EventHandler的处理中,事件所属的对象的类型(比如Pod的创建事件属于Pod对象),可能与reconcile.Requests所加入的对象类型相同。
  3. 事件所属的对象的类型也可能与reconcile.Requests所加入的对象类型不同。例如将Pod的事件映射为所属的ReplicaSet的reconcile.Requests。
  4. EventHandler可能会将一个事件映射为多个reconcile.Requests并加入队列,多个reconcile.Requests可能属于一个对象类型,也可能设计多个对象类型。例如,由于集群扩展导致的Node事件。
  5. 在大多数情况下,建议开发者使用Controller-runtime中已有的EventHandler来实现,而不是自己实现此接口。

(9)Predicate: predicate.Predicate是Controller.Watch的参数,是用于过滤事件的过滤器,过滤器可以复用或者组合。

  1. Predicate接口以事件作为输入,以布尔值作为输出,当返回True时,表示需要将事件加入队列。
  2. Predicate是可选的。
  3. 建议开发者使用Controller-runtime中已有的Predicate实现,但可以使用其它Predicate进行过滤。

流程

Controller-runtime流程如下图

以使用Controller-runtime开发的PodController为例,Controller的整体流程如下。

(1)Source通过Kubernetes APIServer监听Pod对象,提供Pod的事件

&source.KindSource{&v1.Pod{}} -> (Pod foo/bar Create Event)

(2)EventHandler根据Pod事件,将reconcile.Request加入队列

&handler.EnqueueRequestForObject{} -> (reconcile.Request{types.NamespaceName{Name: "foo", Namespace: "bar"}})

(3)从队列中获取reconcile.Request,并调用Reconciler进行同步

Reconciler(reconcile.Request{types.NamespaceName{Name: "foo", Namespace: "bar"}})

其中,Controller的启动由Manger控制。

Manager

Manager是Controller-runtime库中最主要的结构,可以用来启动Controller、管理Controller依赖、提供集群相关资源的获取方法等。

接口

在pkg/manager/manager.go中,定义了Manager接口,部分开发者常用的方法如下:

(1)cluster.Cluster:接口类型,Manager的匿名成员,Manager继承了cluster.Cluster的所有方法。cluster.Cluster提供了一系列方法,以获取与集群相关的对象。

Controller-runtime模块的更多相关文章

  1. Jmeter 之测试片段、Include Controller、模块控制器应用

    一.测试片段是什么? 应用在控制器上的一个特殊线程组,与线程组处于同一层级,必须与Include Controller或模块控制器一起使用才被执行. 二.应用场景 1.当jmeter脚本非常复杂的时候 ...

  2. iOS模式详解—「runtime面试、工作」看我就 🐒 了 ^_^.

    Write in the first[写在最前] 对于从事 iOS 开发人员来说,当提到 ** runtime时,我想都可以说出来 「runtime 运行时」和基本使用的方法.相信很多开发者跟我当初一 ...

  3. iOS 模式详解—「runtime面试、工作」看我就 🐒 了 ^_^.

    引导 Copyright © PBwaterln Unauthorized shall not be *copy reprinted* . 对于从事 iOS 开发人员来说,所有的人都会答出「runti ...

  4. TP3.2框架,实现空模块、空控制器、空操作的页面404替换||同步实现apache报错404页面替换

    一,前言 一.1)以下代码是在TP3.0版本之后,URL的默认模式=>PATHINFO的前提下进行的.(通俗点,URL中index.php必须存在且正确) 代码和讲解如下: 1.空模块解决:ht ...

  5. h5 plus/h5+规范使用,模块索引,教你如何去看h5+的手册

    最近看了下h5+规范的官网,开始觉得晦涩难懂,确实很乱,不过这也是基于我不理解的情况,终于艰难读完了,现在来分享下心得吧,基本看完文章,按我的方法,应该可以直接上手项目. 我准备的工具 hbuilde ...

  6. thinkphp 模块部署

    3.2对模块的访问是自动判断的,所以通常情况下无需配置模块列表即可访问,在部署模块的时候,默认情况下都是基于类似于子目录的URL方式来访问模块的,例如: http://serverName/Home/ ...

  7. ThinkPHP 3.2.3(三)架构之模块化设计

    一.概念 应用:基于同一个入口文件访问的项目称之为一个应用. 模块:一个应用下面可以包含多个模块,每个模块在应用目录下面都是一个独立的子目录,是一个包含配置文件.函数文件和MVC文件(目录)的集合. ...

  8. Onthink学习随笔

    -------------------------------------(写代码不孤独_小小代) 用Onthink写了一个网站暂时还没上线功能略显不全没,完全没有发挥出应有的强大拓展之处,各种地方略 ...

  9. thinkphp学习笔记5—模块化设计

    原文:thinkphp学习笔记5-模块化设计 1.模块结构 完整的ThinkPHP用用围绕模块/控制器/操作设计,并支持多个入口文件盒多级控制.ThinkPHP默认PATHINFO模式,如下: htt ...

  10. 【Yii系列】最佳实践之后台业务框架

    缘起 上面的几章都讲概念了,没有怎么讲到实践的东西,可能会有些枯燥,这很正常的,概念还是需要慢慢啃的,尤其是官网其他的部分,需要狠狠的啃. 什么,你啃不动了?看看官网旁边的那个在线用户吧. 你不啃的时 ...

随机推荐

  1. C语言,实现数字谱到简谱的转换

    C语言,实现数字谱到简谱的转换 前言:本文初编辑于2024年4月28日 CSDN:https://blog.csdn.net/rvdgdsva 博客园:https://www.cnblogs.com/ ...

  2. JavaWeb 中 “转发”与 “重定向”的区别

    JavaWeb 中 "转发"与 "重定向"的区别 每博一文案 人生的常态,就是有聚有散,有得有失,就像山峰一样,总有高低,起伏不断. 曾经,我们是鲜衣怒马的少年 ...

  3. iOS LLVM 中的宏定义

    在阅读 Objc 库源码时常常会遇到很多宏定义,比如宏 SUPPORT_INDEXED_ISA.SUPPORT_PACKED_ISA,代码如下所示: // Define SUPPORT_INDEXED ...

  4. linux打包压缩工具详解

    linux打包压缩工具详解 目录 linux打包压缩工具详解 1.linux文件压缩工具 1.1 compress命令详解 1.2 gzip命令详解 1.3 bzip2命令详解 1.4 xz命令详解 ...

  5. SQL中常用的字符串REVERSE函数和SUBSTRING函数详解!

    今天继续整理日常可能经常遇到的一些处理字符串的函数,记得点赞收藏!以备不时之需! REVERSE(expression)函数解析:SQL Server中的此函数用于反转(颠倒)指定的字符串,也就是说把 ...

  6. d3d12龙书阅读----绘制几何体(下)

    d3d12龙书阅读----绘制几何体(下) 本节在上一节的基础上,对整个绘制过程进行优化,将绘制单个几何体的内容拓展到了多个几何体,同时对根签名进行了进一步地探索. 帧资源 在之前绘制每帧的结尾,我们 ...

  7. saltstack使用

    saltstack中salt-key的用法 介绍: saltstack中master和minion是依靠证书来进行加密通信的.在saltstack中salt-key命令是用来管理证书的 用法: sal ...

  8. vue4 项目的创建

    1,安装vue cli 脚手架,是全局安装npm install -g @vue/cli 可以在输出信息中看到安装位置,例如:C:\Users\xiaochangjian\AppData\Roamin ...

  9. 如何启动?win11下的Linux子系统【4种方法】

    实验室的开发环境在Linux操作系统下,时不时就需要打开Linux环境去操作,而且需要本地编译或者远程SSH.这时候window和Linux切换很不方便.本科的做法就是window+虚拟机的Linux ...

  10. Html简要笔记

    html在线文档: https://www.w3school.com.cn 怎么创建文件我已经会了 1,html快速入门 <!--文档类型说明 注释 --> <!DOCTYPE ht ...