kube-controller-manager源码分析(一)之 NewControllerManagerCommand
以下代码分析基于
kubernetes v1.12.0
版本。本文主要分析https://github.com/kubernetes/kubernetes/tree/v1.12.0/cmd/kube-controller-manager 部分的代码。
本文主要分析 kubernetes/cmd/kube-controller-manager
部分,该部分主要涉及各种类型的controller
的参数解析,及初始化,例如 deployment controller
和statefulset controller
。并没有具体controller
运行的详细逻辑,该部分位于kubernetes/pkg/controller
模块,待后续文章分析。
kube-controller-manager
的cmd
部分代码目录结构如下:
1 | kube-controller-manager |
1. Main函数
kube-controller-manager
的入口函数Main
函数,仍然是采用统一的代码风格,使用Cobra命令行框架。
1 | func main() { |
核心代码:
1 | // 初始化命令行结构体 |
2. NewControllerManagerCommand
该部分代码位于:kubernetes/cmd/kube-controller-manager/app/controllermanager.go
1 | // NewControllerManagerCommand creates a *cobra.Command object with default parameters |
构建一个*cobra.Command
对象,然后执行Run
函数。
2.1. NewKubeControllerManagerOptions
1 | s, err := options.NewKubeControllerManagerOptions() |
初始化controllerManager的参数,其中主要包括了各种controller的option,例如DeploymentControllerOptions
:
1 | // DeploymentControllerOptions holds the DeploymentController options. |
具体代码如下:
1 | // NewKubeControllerManagerOptions creates a new KubeControllerManagerOptions with a default config. |
2.2. AddFlagSet
添加参数及帮助函数。
1 | fs := cmd.Flags() |
3. Run
此部分的代码位于cmd/kube-controller-manager/app/controllermanager.go
基于KubeControllerManagerOptions
运行controllerManager,不退出。
1 | // Run runs the KubeControllerManagerOptions. This should never exit. |
Run函数涉及的核心代码如下:
1 | // 创建controller的context |
其中StartControllers
中的入参NewControllerInitializers
初始化了各种controller。
3.1. CreateControllerContext
CreateControllerContext
构建了各种controller所需的资源的上下文,各种controller在启动时,入参为该context,具体参考initFn(ctx)
。
1 | // CreateControllerContext creates a context struct containing references to resources needed by the |
核心代码为NewSharedInformerFactory
。
1 | // 创建SharedInformerFactory |
SharedInformerFactory
提供了公共的k8s对象的informers
。
1 | // SharedInformerFactory provides shared informers for resources in all known |
3.2. NewControllerInitializers
NewControllerInitializers
定义了各种controller的类型和其对于的启动函数,例如deployment``、statefulset
、replicaset
、replicationcontroller
、namespace
等。
1 | // NewControllerInitializers is a public map of named controller groups (you can start more than one in an init func) |
3.3. StartControllers
1 | func StartControllers(ctx ControllerContext, startSATokenController InitFunc, controllers map[string]InitFunc, unsecuredMux *mux.PathRecorderMux) error { |
核心代码:
1 | for controllerName, initFn := range controllers { |
启动各种controller,controller的启动函数在NewControllerInitializers
中定义了,例如:
1 | // deployment |
3.4. InformerFactory.Start
InformerFactory
实际上是SharedInformerFactory
,具体的实现逻辑在client-go
中的informer的实现机制。
1 | controllerContext.InformerFactory.Start(controllerContext.Stop) |
3.4.1. SharedInformerFactory
SharedInformerFactory是一个informer工厂的接口定义。
1 | // SharedInformerFactory a small interface to allow for adding an informer without an import cycle |
3.4.2. sharedInformerFactory.Start
Start方法初始化各种类型的informer
1 | // Start initializes all requested informers. |
3.4.3. sharedIndexInformer.Run
sharedIndexInformer.Run具体运行了sharedIndexInformer的实现逻辑,该部分待后续对informer机制做专题分析。
1 | func (s *sharedIndexInformer) Run(stopCh <-chan struct{}) { |
4. initFn(ctx)
initFn
实际调用的就是各种类型的controller,代码位于kubernetes/cmd/kube-controller-manager/app/apps.go
,本文以startStatefulSetController
和startDeploymentController
为例,controller中实际调用的函数逻辑位于kubernetes/pkg/controller
中,待后续分析。
4.1. startStatefulSetController
1 | func startStatefulSetController(ctx ControllerContext) (http.Handler, bool, error) { |
其中使用到了InformerFactory
,包含了Pods、StatefulSets、PersistentVolumeClaims、ControllerRevisions的informer。
startStatefulSetController
主要调用的函数为NewStatefulSetController
和对应的Run
函数。
4.2. startDeploymentController
1 | func startDeploymentController(ctx ControllerContext) (http.Handler, bool, error) { |
startDeploymentController
主要调用的函数为NewDeploymentController
和对应的Run
函数。该部分逻辑在kubernetes/pkg/controller
中。
5. 总结
- Kube-controller-manager的代码风格仍然是Cobra命令行框架。通过构造
ControllerManagerCommand
,然后执行command.Execute()
函数。基本的流程就是构造option,添加Flags,执行Run函数。 - cmd部分的调用流程如下:
Main-->NewControllerManagerCommand--> Run(c.Complete(), wait.NeverStop)-->StartControllers-->initFn(ctx)-->startDeploymentController/startStatefulSetController-->sts.NewStatefulSetController.Run/dc.NewDeploymentController.Run-->pkg/controller
。 - 其中
CreateControllerContext
函数用来创建各类型controller所需要使用的context,NewControllerInitializers
初始化了各种类型的controller,其中就包括DeploymentController
和StatefulSetController
等。
基本流程如下:
- 构造controller manager option,并转化为Config对象,执行Run函数。
- 基于Config对象创建ControllerContext,其中包含InformerFactory。
- 基于ControllerContext运行各种controller,各种controller的定义在
NewControllerInitializers
中。 - 执行InformerFactory.Start。
- 每种controller都会构造自身的结构体并执行对应的Run函数。
参考:
- https://github.com/kubernetes/kubernetes/tree/v1.12.0/cmd/kube-controller-manager
- https://github.com/kubernetes/kubernetes/blob/v1.12.0/cmd/kube-controller-manager/controller-manager.go
- https://github.com/kubernetes/kubernetes/blob/v1.12.0/cmd/kube-controller-manager/app/controllermanager.go
- https://github.com/kubernetes/kubernetes/blob/v1.12.0/cmd/kube-controller-manager/app/apps.go
赞赏一下