以下代码分析基于
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
赞赏一下
支付宝打赏
微信打赏