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. SkiaSharp 渲染输出 SVG 文件

    谷歌的 Skia 的一个卖点就是提供了完美的 SVG 的支持,包括输入和输出.输入指的是给一张 SVG 图片,将这个 SVG 渲染出来.输出就是将输出画面保存为 SVG 格式的图片.自然 SkiaSh ...

  2. dotnet 开启 Fiddler 抓包将会让请求 HOST 头被更改

    我在写域名备份功能,想要修改请求的 IP 地址,同时又将原有的请求域名带上.实现方法是修改请求的地址,在 HttpRequestMessage 的 Header 上添加 HOST 记录,记录的值就是原 ...

  3. OpenAI未至,Open-Sora再度升级!已支持生成16秒720p视频

    Open-Sora 在开源社区悄悄更新了!现在支持长达 16 秒的视频生成,分辨率最高可达 720p,并且可以处理任何宽高比的文本到图像.文本到视频.图像到视频.视频到视频和无限长视频的生成需求.我们 ...

  4. 6.Ingress 七层负载

    官方文档:https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/题目: 设置配置环境: [candidate@no ...

  5. Docker镜像基本原理

    前言 Docker系列文章: 如果没有安装过Docker请参考本文最后部分,大家从现在开始一定要按照我做的Demo都手敲一遍,印象会更加深刻的,加油! 为什么学习Docker Docker基本概念 什 ...

  6. 07. rails 创建user模型

    rails帮助命令 rails -h 创建user模型 命令行 haima@haima-PC:/media/haima/34E401CC64DD0E28/site/go/src/ruby/circle ...

  7. AIRIOT助力城市管廊工程,智慧物联守护城市生命线

    ​ 随着科技的不断革新,人工智能.大数据.物联网等新一代技术驱动的智慧城市快速发展,众多领域和行业的参随着科技的不断革新,人工智能.大数据.物联网等新一代技术驱动的智慧城市快速发展,众多领域和行业的参 ...

  8. WPF新建viewModel实例化成员的注意事项

    不要用表达式体去初始化一个用做数据源(比如ItemSource)的引用类型成员.比如这种 public List<MainWindowItem> Items => new List& ...

  9. 使用 TortoiseGit 时,报 Access denied 错误

    当输入正确的密码时,总是报如下错误: 解决方法: 然后弹出如下对话框: 然后编辑本地配置文件: 然后将红色框的SSH配置改为绿色框的 HTTP配置,点击保存,确定. 然后再进行拉取源码,先输入用户名, ...

  10. vue绑定对象,绑定的值不改变的问题

    在使用vue结合elmentui的table组件,对数组绑定,需要编辑数组里一些属性的值.我的情况是,需要在打开这个表时,根据条件插入一些对象到table里,经测试,到这里是没问题的,可以显示新插入的 ...