Controller-runtime模块
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包含了需要匹配状态的资源对象。
- Controller需要提供Reconciler处理从工作队列中获取的请求。
- Controller需要配置相应的资源监听,根据监听到的Event生成reconcile.Requests并加入队列。
(5)Reconciler:为Controller提供同步的功能,Controller可以随时通过资源对象的Name和Namespace来调用Reconciler,调用时,Reconciler将确保系统状态与资源对象所表示的状态匹配。例如,当某个RelicaSet的副本数为5,但系统中只有3个Pod时,同步ReplicaSet资源的Reconciler需要新建两个Pod,并将它们的OwnerReference字段指向对应的ReplicaSet。
- Reconciler包含了Controller所有业务逻辑。
- Reconciler通常只处理单个对象类型,例如只处理ReplicaSets的Reconciler,不处理其它的对象类型。如果需要处理多种类型,需要实现多个Controller。如果你希望通过其他类型来触发Reconciler,例如,通过Pod对象的事件来触发ReplicaSet的Recon-ciler,则可以提供一个映射,通过该映射将触发Reconciler的类型映射到需要匹配的类型。
- 提供给Reconciler的参数是需要匹配的资源对象的Name和Namespace。
- 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接口来提供此对象的创建、更新、删除事件。
- Source通过Watch API提供Kubernetes指定对象的事件流。
- 建议开发者使用Controller-runtime中已有Source实现,而不是自己实现此接口。
(8)EventHandler:handler.Eventhandler是Controller.Watch参数,用于将事件对应的reconcile.Requests加入队列。例如,从Source中接收到一个Pod的创建事件,eventhandler.EnqueueHandler会根据Pod的Name与Namespace生成reconcile.Requests后,加入队列。
- EventHandlers处理事件的方式是将一个或多个reconcile.Requests加入队列。
- 在EventHandler的处理中,事件所属的对象的类型(比如Pod的创建事件属于Pod对象),可能与reconcile.Requests所加入的对象类型相同。
- 事件所属的对象的类型也可能与reconcile.Requests所加入的对象类型不同。例如将Pod的事件映射为所属的ReplicaSet的reconcile.Requests。
- EventHandler可能会将一个事件映射为多个reconcile.Requests并加入队列,多个reconcile.Requests可能属于一个对象类型,也可能设计多个对象类型。例如,由于集群扩展导致的Node事件。
- 在大多数情况下,建议开发者使用Controller-runtime中已有的EventHandler来实现,而不是自己实现此接口。
(9)Predicate: predicate.Predicate是Controller.Watch的参数,是用于过滤事件的过滤器,过滤器可以复用或者组合。
- Predicate接口以事件作为输入,以布尔值作为输出,当返回True时,表示需要将事件加入队列。
- Predicate是可选的。
- 建议开发者使用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模块的更多相关文章
- Jmeter 之测试片段、Include Controller、模块控制器应用
一.测试片段是什么? 应用在控制器上的一个特殊线程组,与线程组处于同一层级,必须与Include Controller或模块控制器一起使用才被执行. 二.应用场景 1.当jmeter脚本非常复杂的时候 ...
- iOS模式详解—「runtime面试、工作」看我就 🐒 了 ^_^.
Write in the first[写在最前] 对于从事 iOS 开发人员来说,当提到 ** runtime时,我想都可以说出来 「runtime 运行时」和基本使用的方法.相信很多开发者跟我当初一 ...
- iOS 模式详解—「runtime面试、工作」看我就 🐒 了 ^_^.
引导 Copyright © PBwaterln Unauthorized shall not be *copy reprinted* . 对于从事 iOS 开发人员来说,所有的人都会答出「runti ...
- TP3.2框架,实现空模块、空控制器、空操作的页面404替换||同步实现apache报错404页面替换
一,前言 一.1)以下代码是在TP3.0版本之后,URL的默认模式=>PATHINFO的前提下进行的.(通俗点,URL中index.php必须存在且正确) 代码和讲解如下: 1.空模块解决:ht ...
- h5 plus/h5+规范使用,模块索引,教你如何去看h5+的手册
最近看了下h5+规范的官网,开始觉得晦涩难懂,确实很乱,不过这也是基于我不理解的情况,终于艰难读完了,现在来分享下心得吧,基本看完文章,按我的方法,应该可以直接上手项目. 我准备的工具 hbuilde ...
- thinkphp 模块部署
3.2对模块的访问是自动判断的,所以通常情况下无需配置模块列表即可访问,在部署模块的时候,默认情况下都是基于类似于子目录的URL方式来访问模块的,例如: http://serverName/Home/ ...
- ThinkPHP 3.2.3(三)架构之模块化设计
一.概念 应用:基于同一个入口文件访问的项目称之为一个应用. 模块:一个应用下面可以包含多个模块,每个模块在应用目录下面都是一个独立的子目录,是一个包含配置文件.函数文件和MVC文件(目录)的集合. ...
- Onthink学习随笔
-------------------------------------(写代码不孤独_小小代) 用Onthink写了一个网站暂时还没上线功能略显不全没,完全没有发挥出应有的强大拓展之处,各种地方略 ...
- thinkphp学习笔记5—模块化设计
原文:thinkphp学习笔记5-模块化设计 1.模块结构 完整的ThinkPHP用用围绕模块/控制器/操作设计,并支持多个入口文件盒多级控制.ThinkPHP默认PATHINFO模式,如下: htt ...
- 【Yii系列】最佳实践之后台业务框架
缘起 上面的几章都讲概念了,没有怎么讲到实践的东西,可能会有些枯燥,这很正常的,概念还是需要慢慢啃的,尤其是官网其他的部分,需要狠狠的啃. 什么,你啃不动了?看看官网旁边的那个在线用户吧. 你不啃的时 ...
随机推荐
- SkiaSharp 渲染输出 SVG 文件
谷歌的 Skia 的一个卖点就是提供了完美的 SVG 的支持,包括输入和输出.输入指的是给一张 SVG 图片,将这个 SVG 渲染出来.输出就是将输出画面保存为 SVG 格式的图片.自然 SkiaSh ...
- dotnet 开启 Fiddler 抓包将会让请求 HOST 头被更改
我在写域名备份功能,想要修改请求的 IP 地址,同时又将原有的请求域名带上.实现方法是修改请求的地址,在 HttpRequestMessage 的 Header 上添加 HOST 记录,记录的值就是原 ...
- OpenAI未至,Open-Sora再度升级!已支持生成16秒720p视频
Open-Sora 在开源社区悄悄更新了!现在支持长达 16 秒的视频生成,分辨率最高可达 720p,并且可以处理任何宽高比的文本到图像.文本到视频.图像到视频.视频到视频和无限长视频的生成需求.我们 ...
- 6.Ingress 七层负载
官方文档:https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/题目: 设置配置环境: [candidate@no ...
- Docker镜像基本原理
前言 Docker系列文章: 如果没有安装过Docker请参考本文最后部分,大家从现在开始一定要按照我做的Demo都手敲一遍,印象会更加深刻的,加油! 为什么学习Docker Docker基本概念 什 ...
- 07. rails 创建user模型
rails帮助命令 rails -h 创建user模型 命令行 haima@haima-PC:/media/haima/34E401CC64DD0E28/site/go/src/ruby/circle ...
- AIRIOT助力城市管廊工程,智慧物联守护城市生命线
随着科技的不断革新,人工智能.大数据.物联网等新一代技术驱动的智慧城市快速发展,众多领域和行业的参随着科技的不断革新,人工智能.大数据.物联网等新一代技术驱动的智慧城市快速发展,众多领域和行业的参 ...
- WPF新建viewModel实例化成员的注意事项
不要用表达式体去初始化一个用做数据源(比如ItemSource)的引用类型成员.比如这种 public List<MainWindowItem> Items => new List& ...
- 使用 TortoiseGit 时,报 Access denied 错误
当输入正确的密码时,总是报如下错误: 解决方法: 然后弹出如下对话框: 然后编辑本地配置文件: 然后将红色框的SSH配置改为绿色框的 HTTP配置,点击保存,确定. 然后再进行拉取源码,先输入用户名, ...
- vue绑定对象,绑定的值不改变的问题
在使用vue结合elmentui的table组件,对数组绑定,需要编辑数组里一些属性的值.我的情况是,需要在打开这个表时,根据条件插入一些对象到table里,经测试,到这里是没问题的,可以显示新插入的 ...