NewControllerManagerCommand
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部分代码目录结构如下:
kube-controller-manager
├── app
│ ├── apps.go # 包含:startDeploymentController、startReplicaSetController、startStatefulSetController、startDaemonSetController
│ ├── autoscaling.go # startHPAController
│ ├── batch.go # startJobController、startCronJobController
│ ├── bootstrap.go
│ ├── certificates.go
│ ├── cloudproviders.go
│ ├── config
│ │ └── config.go # config: controller manager执行的上下文
│ ├── controllermanager.go # 包含:NewControllerManagerCommand、Run、NewControllerInitializers、StartControllers等
│ ├── core.go # startServiceController、startNodeIpamController、startPersistentVolumeBinderController、startNamespaceController等
│ ├── options # 包含不同controller的option参数
│ │ ├── attachdetachcontroller.go
│ │ ├── csrsigningcontroller.go
│ │ ├── daemonsetcontroller.go # DaemonSetControllerOptions
│ │ ├── deploymentcontroller.go # DeploymentControllerOptions
│ │ ├── deprecatedcontroller.go
│ │ ├── endpointcontroller.go
│ │ ├── garbagecollectorcontroller.go
│ │ ├── hpacontroller.go
│ │ ├── jobcontroller.go
│ │ ├── namespacecontroller.go # NamespaceControllerOptions
│ │ ├── nodeipamcontroller.go
│ │ ├── nodelifecyclecontroller.go
│ │ ├── options.go # KubeControllerManagerOptions、NewKubeControllerManagerOptions
│ │ ├── persistentvolumebindercontroller.go
│ │ ├── podgccontroller.go
│ │ ├── replicasetcontroller.go # ReplicaSetControllerOptions
│ │ ├── replicationcontroller.go
│ │ ├── resourcequotacontroller.go
│ │ ├── serviceaccountcontroller.go
│ │ └── ttlafterfinishedcontroller.go
└── controller-manager.go # main入口函数1. Main函数
kube-controller-manager的入口函数Main函数,仍然是采用统一的代码风格,使用Cobra命令行框架。
核心代码:
该部分代码位于:kubernetes/cmd/kube-controller-manager/app/controllermanager.go
构建一个*cobra.Command对象,然后执行Run函数。
2.1. NewKubeControllerManagerOptions
初始化controllerManager的参数,其中主要包括了各种controller的option,例如DeploymentControllerOptions:
具体代码如下:
2.2. AddFlagSet
添加参数及帮助函数。
3. Run
此部分的代码位于cmd/kube-controller-manager/app/controllermanager.go
基于KubeControllerManagerOptions运行controllerManager,不退出。
Run函数涉及的核心代码如下:
其中StartControllers中的入参NewControllerInitializers初始化了各种controller。
3.1. CreateControllerContext
CreateControllerContext构建了各种controller所需的资源的上下文,各种controller在启动时,入参为该context,具体参考initFn(ctx)。
核心代码为NewSharedInformerFactory。
SharedInformerFactory提供了公共的k8s对象的informers。
3.2. NewControllerInitializers
NewControllerInitializers定义了各种controller的类型和其对于的启动函数,例如deployment``、statefulset、replicaset、replicationcontroller、namespace等。
3.3. StartControllers
核心代码:
启动各种controller,controller的启动函数在NewControllerInitializers中定义了,例如:
3.4. InformerFactory.Start
InformerFactory实际上是SharedInformerFactory,具体的实现逻辑在client-go中的informer的实现机制。
3.4.1. SharedInformerFactory
SharedInformerFactory是一个informer工厂的接口定义。
3.4.2. sharedInformerFactory.Start
Start方法初始化各种类型的informer
3.4.3. sharedIndexInformer.Run
sharedIndexInformer.Run具体运行了sharedIndexInformer的实现逻辑,该部分待后续对informer机制做专题分析。
4. initFn(ctx)
initFn实际调用的就是各种类型的controller,代码位于kubernetes/cmd/kube-controller-manager/app/apps.go,本文以startStatefulSetController和startDeploymentController为例,controller中实际调用的函数逻辑位于kubernetes/pkg/controller中,待后续分析。
其中使用到了InformerFactory,包含了Pods、StatefulSets、PersistentVolumeClaims、ControllerRevisions的informer。
startStatefulSetController主要调用的函数为NewStatefulSetController和对应的Run函数。
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
最后更新于
这有帮助吗?