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

3.2.2         Controller初始化

接下来,我们继续分析Controller的初始化过程。通过前面对于CRD的介绍,借助Kubebuilder这个“脚手架”工具,我们可以快速生成 Controller 的文件,部分代码片段见代码清单 3-8。由此可见,CRD的 Controller初始化的核心代码是 SetupWithManager方法,借助这个方法,就可以完成 CRD在 Manager对象中的安装,最后通过 Manager对象的 start方法来完成 CRDController的运行。

func(r*DemoReconciler)Reconcile(reqctrl.Request)(ctrl.Result,error){

_=context.Background()

_=r.Log.WithValues("demo",req.NamespacedName)


 

//书写你⾃定义的代码逻辑

returnctrl.Result{},nil

 

}

 

//SetupWithManager使⽤ Manager设置Controller.

func (r*DemoReconciler)SetupWithManager(mgrctrl.Manager)error{returnctrl.NewControllerManagedBy(mgr).

For(&yangweiweiv1.Demo{}).

Complete(r)


}

它首先借助Controller-runtime包初始化Builder对象,当它完成Complete方法时,实际完成了 CRDReconciler对象的初始化,而这个对象是一个接口方法,它必须实现 Reconcile方法。

下面我们分别对上述初始化的方法做进一步的梳理。ctrl.NewControllerManagedBy   方法实际借助 Controller-runtime完成了 Builder对象的构建,并借助它关联 CRDAPI定义的 Scheme信息,从而得知 CRD的Controller需要监听的 CRD 类型、版本等信息。这个方法的最后一步是 Complete 的过程。为了便于理解,部分代码片段见代码清单3-9。

func(blder*Builder)Complete(rreconcile.Reconciler)error{

_,err:=blder.Build(r)returnerr

}

 

//构建应⽤程序,并返回创建的ControllerManagedBy.

func(blder*Builder)Build(rreconcile.Reconciler)(controller.Controller,error){

...

//设置ControllerManagedBy

iferr:=blder.doController(r);err!=nil{returnnil,err

}

//设置Watch

iferr:=blder.doWatch();err!=nil{returnnil,err

}

 

returnblder.ctrl,nil


}

 

在构建 Controller的方法中最重要的两个步骤是 doController和 doWatch。 在doController的过程中,实际的核心步骤是完成 Controller对象的构建,从而实现基于Scheme和 Controller对象的 CRD的监听流程。而在构建 Controller的过程中,它的 do字段实际对应的是 Reconciler接口类型定义的方法,也就是在Controller对象生成之后,必须实现这个定义的方法。它是如何使Reconciler对象同Controller产生联系的?实际上,在 Controller初始化的过程中,借助了 Options参数对象中设计的 Reconciler对象,并将其传递给了Controller对象的 do字段。所以当我们调用 SetupWithManager方法的时候,不仅完成了 Controller的初始化,还完成了 Controller 监听资源的注册与发现过程,同时将CRD的必要实现方法(Reconcile方法)进行了再现。至此,我们完成了Controller的初始化分析,具体内容见代码清单3-10。

typeControllerstruct{

Doreconcile.Reconciler

}

 

typeReconcilerinterface{

Reconcile(context.Context,Request)(Result,error)

}

上一篇:带你读《云原生应用开发 Operator原理与实践》第三章 Kubebuilder 原理3.2 Kubebuilder 模块分析(四)


下一篇:带你读《云原生应用开发 Operator原理与实践》第三章 Kubebuilder 原理3.2 Kubebuilder 模块分析(一)