本文主要分析controller-runtime的源码,源码版本为v0.16.3
1. 概述
controller-runtime源码地址:https://github.com/kubernetes-sigs/controller-runtime。
controller-runtime项目是一个用于快速构建k8s operator的工具包。其中kubebuilder和operator-sdk项目都是通过controller-runtime项目来快速编写k8s operator的工具。
本文以kubebuilder的代码生成架构为例,分析controller-runtime的逻辑。kubebuilder框架生成的代码参考:https://github.com/huweihuang/venus
2. controller-runtime架构图
代码目录:
1 | pkg |
3. Operator框架逻辑
代码参考:https://github.com/huweihuang/venus/blob/main/cmd/app/operator.go#L71
operator代码框架的主体逻辑包括以下几个部分。
-
manager
:主要用来管理多个的controller,构建,注册,运行controller。 -
controller
:主要用来封装reconciler的控制器。 -
reconciler
:具体执行业务逻辑的函数。
manger的框架主要包含以下几个部分。
-
mgr:=ctrl.NewManager:构建一个manager对象。
-
Reconciler.SetupWithManager(mgr):注册controller到manager对象。
-
mgr.Start(ctrl.SetupSignalHandler()):运行manager从而运行controller的逻辑。
代码如下:
1 | // 构建manager对象,主要的初始化参数包括 |
4. NewManager
NewManager初始化一个manager 用来管理和创建controller对象。一个manager可以关联多个controller对象。manager是一个接口,而最终是实现结构体是controllerManager
的对象。
4.1. Manager接口
1 | type Manager interface { |
4.2. NewControllerManager
New构建一个具体的controllerManager的对象。
1 | func New(config *rest.Config, options Options) (Manager, error) { |
5. SetupWithManager
SetupWithManager将具体的controller注册到manager中。其中通过Complete
完成controller的初始化。
1 | // SetupWithManager sets up the controller with the Manager. |
SetupWithManager通过NewControllerManagedBy方法构建了一个Builder的对象。
1 | // Builder builds a Controller. |
通过builder对象完成controller的初始化。
5.1. controller初始化
1 | // Build builds the Application Controller and returns the Controller it created. |
doController
最终通过调用NewUnmanaged
构建一个controller对象。并传入自定义的reconciler对象。
1 | func New(name string, mgr manager.Manager, options Options) (Controller, error) { |
5.2. 添加event handler
doWatch
最终会运行informer.start添加event handler。
1 | // Watch implements controller.Controller. |
add event handler
1 | func (is *Informer) Start(ctx context.Context, handler handler.EventHandler, queue workqueue.RateLimitingInterface, |
6. mgr.Start
controllerManager运行之前注册的runnables的函数,其中包括controller的函数。
1 | func (cm *controllerManager) Start(ctx context.Context) (err error) { |
6.1. controller.start
start主要包含2个部分
- 同步cache:WaitForSync
- 启动指定并发数的worker:processNextWorkItem
该部分的代码逻辑跟k8s controller-manager中的具体的controller的逻辑类似。
1 | func (c *Controller) Start(ctx context.Context) error { |
6.2. processNextWorkItem
经典的processNextWorkItem
函数,最终调用reconcileHandler
来处理具体的逻辑。
1 | func (c *Controller) processNextWorkItem(ctx context.Context) bool { |
7. reconcileHandler
reconcileHandler
部分的代码是整个reconciler逻辑中的核心,自定义的reconciler函数最终是调用了reconcileHandler来实现,并且该函数描述了具体的任务队列处理的几种类型。
err != nil
:如果错误不为空,则重新入队,等待处理。result.RequeueAfter > 0
:如果指定RequeueAfter > 0,则做延迟入队处理。result.Requeue
:如何指定了requeue则表示马上重新入队处理。err == nil
: 如果错误为空,表示reconcile成功,则移除队列的任务。
1 | func (c *Controller) reconcileHandler(ctx context.Context, obj interface{}) { |
8. 总结
- controller-runtime封装了k8s-controller-manager控制器的主要逻辑,其中就包括创建list-watch对象,waitForSync等,创建任务队列,将任务处理的goroutine抽象成一个reconcile函数,使用户更方便的编写operator工具。
- kubebuilder是一个基于controller-runtime框架的命令生成工具。可以用于快速生成和部署crd对象,快速生成controller-runtime框架的基本代码。
- controller-runtime框架的最核心是reconcileHandler函数,该函数定义了reconcile的4种错误处理及入队重试的类型。可以根据具体的业务需求选择合适的方法来处理。
参考:
赞赏一下