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系列】最佳实践之后台业务框架
缘起 上面的几章都讲概念了,没有怎么讲到实践的东西,可能会有些枯燥,这很正常的,概念还是需要慢慢啃的,尤其是官网其他的部分,需要狠狠的啃. 什么,你啃不动了?看看官网旁边的那个在线用户吧. 你不啃的时 ...
随机推荐
- WPF 应用启动过程同时启动多个 UI 线程且访问 ContentPresenter 可能让多个 UI 线程互等
在应用启动过程里,除了主 UI 线程之外,如果还多启动了新的 UI 线程,且此新的 UI 线程碰到 ContentPresenter 类型,那么将可能存在让新的 UI 线程和主 UI 线程互等.这是多 ...
- GitHub Action 新上线 WPF .NET Core 自动构建模板
在很土豪的微软免费给大家提供 GitHub 的构建服务器受到了小伙伴们的一堆好评之后,微软最近推出了 WPF 的 .NET Core 版本的模板,可以快速上手 WPF 项目的自动构建,支持自动进行单元 ...
- async 与 promise 的区别
async函数会引式返回一个promise,而promise的resolve值就是函数return的值 使用async和await明显节约了不少代码,不需要.then,不需要写匿名函数处理promis ...
- Codeforces Round #922 (Div. 2) ABCD
A. Brick Wall 很直白的贪心,显然就是全放横着的砖最优,每行中最多能放 \(\lfloor \dfrac{m}{2} \rfloor\) 个,答案为 \(n \cdot \lfloor \ ...
- axios的基本
目录 axios基本使用.html axios+vue.html axios基本使用.html <!DOCTYPE html> <html lang="en"&g ...
- cuBlas API Launch Latency 耗时异常分析记录
一.背景 最近在做 AI 编译器生成 Kernel 支持 Bert 模型训练调优工作,在分析 bert 的timeline中发现,在每个 step 的前两个 cinn_instruction_run ...
- idea推送代码忽略指定文件,文件夹配置
idea推送代码忽略指定文件,文件夹配置 今天碰到一个问题,配置了.gitignore文件后没有生效,整了半天,最后发现一种直接配置的方法,可以指定文件夹,或者指定文件类型 打开设置
- 保障升级:Splashtop 公布安全顾问委员会成员
加利福尼亚州圣何塞,2020年12月17日-远程访问和远程支持解决方案的全球领导者 Splashtop Inc. 召集了网络安全性和合规性方面的领先专家,成立了该公司的安全顾问委员会.这组顾问有助于指 ...
- IPv6 — 网际协议第 6 版
目录 文章目录 目录 IPv6 IPv6 的发展 IPv6 网络基本概念 IPv6 的特性 IPv4 与 IPv6 的比较 IPv6 IPv6(Internet Protocol version 6, ...
- uniapp-vue3-oadmin手机后台实例|vite5.x+uniapp多端仿ios管理系统
原创vue3+uniapp+uni-ui跨端仿ios桌面后台OA管理模板Uni-Vue3-WeOS. uniapp-vue3-os一款基于uni-app+vite5.x+pinia等技术开发的仿ios ...