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 controllerstatefulset controller。并没有具体controller运行的详细逻辑,该部分位于kubernetes/pkg/controller模块,待后续文章分析。

kube-controller-managercmd部分代码目录结构如下:

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入口函数

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``、statefulsetreplicasetreplicationcontrollernamespace等。

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,本文以startStatefulSetControllerstartDeploymentController为例,controller中实际调用的函数逻辑位于kubernetes/pkg/controller中,待后续分析。

其中使用到了InformerFactory,包含了Pods、StatefulSets、PersistentVolumeClaims、ControllerRevisions的informer。

startStatefulSetController主要调用的函数为NewStatefulSetController和对应的Run函数。

startDeploymentController主要调用的函数为NewDeploymentController和对应的Run函数。该部分逻辑在kubernetes/pkg/controller中。

5. 总结

  1. Kube-controller-manager的代码风格仍然是Cobra命令行框架。通过构造ControllerManagerCommand,然后执行command.Execute()函数。基本的流程就是构造option,添加Flags,执行Run函数。

  2. cmd部分的调用流程如下:Main-->NewControllerManagerCommand--> Run(c.Complete(), wait.NeverStop)-->StartControllers-->initFn(ctx)-->startDeploymentController/startStatefulSetController-->sts.NewStatefulSetController.Run/dc.NewDeploymentController.Run-->pkg/controller

  3. 其中CreateControllerContext函数用来创建各类型controller所需要使用的context,NewControllerInitializers初始化了各种类型的controller,其中就包括DeploymentControllerStatefulSetController等。

基本流程如下:

  1. 构造controller manager option,并转化为Config对象,执行Run函数。

  2. 基于Config对象创建ControllerContext,其中包含InformerFactory。

  3. 基于ControllerContext运行各种controller,各种controller的定义在NewControllerInitializers中。

  4. 执行InformerFactory.Start。

  5. 每种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

最后更新于

这有帮助吗?