DeploymentController

kube-controller-manager源码分析(二)之 DeploymentController

以下代码分析基于 kubernetes v1.12.0 版本。

本文主要以deployment controller为例,分析该类controller的运行逻辑。此部分代码主要为位于pkg/controller/deploymentpkg/controller部分的代码包括了各种类型的controller的具体实现。

controller managerpkg部分代码目录结构如下:

controller  # 主要包含各种controller的具体实现
├── apis
├── bootstrap
├── certificates
├── client_builder.go
├── cloud
├── clusterroleaggregation
├── controller_ref_manager.go
├── controller_utils.go  # WaitForCacheSync
├── cronjob
├── daemon
├── deployment   # deployment controller
   ├── deployment_controller.go # NewDeploymentController、Run、syncDeployment
   ├── progress.go   # syncRolloutStatus
   ├── recreate.go   # rolloutRecreate
   ├── rollback.go   # rollback
   ├── rolling.go    # rolloutRolling
   ├── sync.go
├── disruption  # disruption controller
├── endpoint
├── garbagecollector
├── history
├── job
├── lookup_cache.go
├── namespace   # namespace controller
├── nodeipam
├── nodelifecycle
├── podautoscaler
├── podgc
├── replicaset   # replicaset controller
├── replication  # replication controller
├── resourcequota
├── route
├── service   # service controller
├── serviceaccount
├── statefulset   # statefulset controller
└── volume  # PersistentVolumeController、AttachDetachController、PVCProtectionController

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

2. NewDeploymentController

NewDeploymentController主要构建DeploymentController结构体。

该部分主要处理了以下逻辑:

  • 构建并运行事件处理器eventBroadcaster

  • 初始化赋值rsControlclientsetworkqueue

  • 添加dInformerrsInformerpodInformerResourceEventHandlerFuncs,其中主要为AddFuncUpdateFuncDeleteFunc三类方法。

  • 构造deployment、rs、pod的Informer的Lister函数和HasSynced函数。

  • 调用syncHandler,来实现syncDeployment

2.1. eventBroadcaster

调用事件处理器来记录deployment相关的事件。

2.2. rsControl

构造DeploymentController,包括clientsetworkqueuersControl。其中rsControl是具体实现rs逻辑的controller。

2.3. Informer().AddEventHandler

添加dInformerrsInformerpodInformerResourceEventHandlerFuncs,其中主要为AddFuncUpdateFuncDeleteFunc三类方法。

2.4. Informer.Lister()

调用dInformerrsInformerpodInformerLister()方法。

2.5. Informer().HasSynced

调用Informer().HasSynced,判断是否缓存完成;

2.6. syncHandler

syncHandler具体为syncDeployment,syncHandler负责deployment的同步实现。

完整代码如下:

3. DeploymentController.Run

Run执行watch和sync的操作。

3.1. WaitForCacheSync

WaitForCacheSync主要是用来在List-Watch机制中可以保持当前cache的数据与etcd的数据一致。

3.2. dc.worker

worker调用了processNextWorkItemprocessNextWorkItem最终调用了syncHandler,而syncHandlerNewDeploymentController中赋值的具体函数为syncDeployment

NewDeploymentController中的syncHandler赋值:

4. syncDeployment

syncDeployment基于给定的key执行sync deployment的操作。

主要流程如下:

  1. 通过SplitMetaNamespaceKey获取namespace和deployment对象的name。

  2. 调用Lister的接口获取的deployment的对象。

  3. getReplicaSetsForDeployment获取deployment管理的ReplicaSet对象。

  4. getPodMapForDeployment获取deployment管理的pod,基于ReplicaSet来分组。

  5. checkPausedConditions检查deployment是否是pause状态并添加合适的condition

  6. isScalingEvent检查deployment的更新是否来自于一个scale的事件,如果是则执行scale的操作。

  7. 根据DeploymentStrategyType类型执行rolloutRecreaterolloutRolling

完整代码如下:

4.1. Get deployment

4.2. getReplicaSetsForDeployment

getReplicaSetsForDeployment具体代码:

4.3. getPodMapForDeployment

getPodMapForDeployment具体代码:

4.4. checkPausedConditions

checkPausedConditions具体代码:

4.5. isScalingEvent

isScalingEvent具体代码:

4.6. rolloutRecreate

rolloutRecreate具体代码:

4.7. rolloutRolling

rolloutRolling具体代码:

5. 总结

startDeploymentController主要包括NewDeploymentControllerDeploymentController.Run两部分。

NewDeploymentController主要构建DeploymentController结构体。

该部分主要处理了以下逻辑:

  1. 构建并运行事件处理器eventBroadcaster

  2. 初始化赋值rsControlclientsetworkqueue

  3. 添加dInformerrsInformerpodInformerResourceEventHandlerFuncs,其中主要为AddFuncUpdateFuncDeleteFunc三类方法。

  4. 构造deployment、rs、pod的Informer的Lister函数和HasSynced函数。

  5. 赋值syncHandler,来实现syncDeployment

DeploymentController.Run主要包含WaitForCacheSyncsyncDeployment两部分。

syncDeployment基于给定的key执行sync deployment的操作。

主要流程如下:

  1. 通过SplitMetaNamespaceKey获取namespace和deployment对象的name。

  2. 调用Lister的接口获取的deployment的对象。

  3. getReplicaSetsForDeployment获取deployment管理的ReplicaSet对象。

  4. getPodMapForDeployment获取deployment管理的pod,基于ReplicaSet来分组。

  5. checkPausedConditions检查deployment是否是pause状态并添加合适的condition

  6. isScalingEvent检查deployment的更新是否来自于一个scale的事件,如果是则执行scale的操作。

  7. 根据DeploymentStrategyType类型执行rolloutRecreaterolloutRolling

参考:

最后更新于

这有帮助吗?