带你读《云原生应用开发 Operator原理与实践》第三章 Kubebuilder 原理3.3 Controller-runtime 模块分析(五)-阿里云开发者社区

开发者社区> 人民邮电出版社> 正文

带你读《云原生应用开发 Operator原理与实践》第三章 Kubebuilder 原理3.3 Controller-runtime 模块分析(五)

简介: 带你读《云原生应用开发 Operator原理与实践》第三章 Kubebuilder 原理3.3 Controller-runtime 模块分析
+关注继续查看

3.3.3        Controller

Controller是 Controller-runtime的核心结构, 其实现了 Controller的基本逻辑:Controller管理一个工作队列,并从 source.Sources中获取 reconcile.Requests加入队列,通过执行 reconcile.Reconciler来处理队列中的每项 reconcile.Requests,而 reconcile.

Reconciler可以通过读写 Kubernetes 资源来确保集群状态与期望状态一致。

接口:

Controller接口定义在 pkg/controller/controller.go下,包括如下内容。

(1)         reconcile.Reconciler:匿名接口,定义了 Reconcile(context.Context,Request)

(Result,error

(2)      Watch(srcsource.Source,eventhandlerhandler.EventHandler,predicates

...predicate.Predicate)error:定义入队 reconcile.Requests,Watch() 方法会从 sour-ce.Source中获取Event, 并根据参数 Eventhandler来决定如何入队, 根据参数Predicates进行 Event过滤,Preficates可能有多个, 只有所有的 Preficates都返回True 时,才会将 Event 发送给 Eventhandler 处理。

(3)      Start(ctxcontext.Context)error:Controller的启动方法,实现了 Controller接口的对象,也实现了Runnable,因此,该方法可以被Manager管理。

(4)       GetLogger()logr.Logger:获取 Controller内的 Logger,用于日志输出。

实现:

Controller的实现在 pkg/internal/controller/controller.go下,为结构体 Controller,Controller结构体中包括的主要成员如下。

(1)   Namestring:必须设置, 用于标识 Controller,会在 Controller的日志输出中进行关联。

(2)  MaxConcurrentReconcilesint:定义允许 reconcile.Reconciler 同时运行的最多个数,默认为 1。

(3)  Doreconcile.Reconciler:定义了 Reconcile() 方法,包含了 Controller同步的业务逻辑。Reconcile()能在任意时刻被调用,接收一个对象的 Name与 Namespace,并同步集群当前实际状态至该对象被设置的期望状态。

(4)  MakeQueue    func()    workqueue.RateLimitingInterface:用 于在    Controller启动时,创建工作队列。由于标准的Kubernetes工作队列创建后会立即启动,因此,如果在 Controller启动前就创建队列,在重复调用 controller.New() 方法创建 Con-troller 的情况下,就会导致 Goroutine 泄露。

(5)  Queueworkqueue.RateLimitingInterface:使用上面方法创建的工作队列。

(6)  SetFieldsfunc(iinterface{})error:用 于 从 Manager中 获 取 Controller赖的方法, 依赖包括 Sourcess、EventHandlers和 Predicates等。 此方法存储的是controllerManager.SetFields()方法。

(7)  StartedBool:用于表示Controller 是否已经启动。

(8)  CacheSyncTimeouttime.Duration:定义了 Cache 完成同步的等待时长,超过时长会被认为是同步失败。默认时长为 2分钟。

(9)  startWatches[ ]watchDescription:定 义 了 一 组Watch操 作 的 属 性, 会在Controller启动时, 根据属性进行 Watch操作。watchDescription的定义见代码 清单3-30,watchDescription包括 Event的源 source.Source、Event的入队方法handler.EventHandler以及 Event的过滤方法 predicate.Predicate。

typewatchDescriptionstruct{srcsource.Source

handlerhandler.EventHandlerpredicates[]predicate.Predicate


}

 

(10)  LogLogr.Logger:用于记录日志的日志对象。

Controller的主要逻辑在Controller.Start()方法内,流程如图 3-4所示。

image.png

 

                                 图 3—4Controiier 逻辑

 

(1) Manager调用 Start()方法后,进入 Controller 的启动流程,经过选举等预处理后,Controller进入Start()方法。

(2)  Controller根据 MakeQueue() 创建工作队列,并启动工作队列。

(3) Controller根据 startWatches参数启动各个 Watch 流程,并将工作队列注入各个Watcher中。 

(4) Controller根据 MaxConcurrentReconciles启动多个 Worker程序,用于处理队列中的对象。

(5) Work程序先从工作队列中获取需要处理的对象,然后调用 Controller成员 Do的 Reconcile()方法进行处理。

(6)  根据 Reconcile() 方法返回的结果, 将对象重新入队列或从队列中删除。重新入队列的方法可以是带有一定延迟的Queue.AddAfter(), 也可以是有限速的 Queue.AddRateLimited()。重新加入的次数无限制。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Android开发中StackOverflowError
<div class="edit_area" id="330486" style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px"> <div style="margin:17pt 0cm 16.5pt"><strong><span style="font-size:32px">Andro
1089 0
《区块链DAPP开发入门、代码实现、场景应用》笔记1——天外飞仙DAPP
Solidity编程语言解决了编写智能合约的不友好的问题,但是当合约编译并部署之后,对与这些接口的访问,对于一般的使用者来说,门槛有点高, 对普通用户来说也是非常不友好,为了使广大用户理解并方便快捷的访问区块链,以及区块链上的智能合约系统,开发者必须提供操作界面和结果查看界面,来简化用户访问和操作区块链的方式。
3953 0
Android开发中StackOverflowError
Android开发中StackOverflowError错误实例分析 一、概述  我在一个复杂的layout嵌套较多的android界面,碰到了java.lang.StackOverflowError这个Fatal Exception,app程序crash退出。这个错误出现的比较奇怪,在我做技术调研的时候,这个界面是放在单独的一个程序中展示的,工作很正常,没有出现这个严重错误,
958 0
来,你认为应用架构的核心使命是什么? | 开发者必读(053期)
最炫的技术新知、最热门的大咖公开课、最有趣的开发者活动、最实用的工具干货,就在《开发者必读》!
701 0
iOS翻页视图控制器UIPageViewController的应用(二)
iOS翻页视图控制器UIPageViewController的应用
21 0
【iOS开发】UIScrollView 看不到内容、UIScrollView 不能滑动
初学者第一次使用 UIScrollView 的时候,很可能会遇到 UIScrollView 滑动不了,或者明明添加了内容,却看不到的问题。 这里展示最简洁、最常态化的一种在 UIScrollView 中添加可以滑动的 UIImageView 的案例。
653 0
472
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载