For the complete documentation index, see llms.txt. This page is also available as Markdown.

DeploymentController

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

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

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

controller manager的pkg部分代码目录结构如下:

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

1. startDeploymentController

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

2. NewDeploymentController

NewDeploymentController主要构建DeploymentController结构体。

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

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

  • 初始化赋值rsControl、clientset、workqueue。

  • 添加dInformer、rsInformer、podInformer的ResourceEventHandlerFuncs,其中主要为AddFunc、UpdateFunc、DeleteFunc三类方法。

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

  • 调用syncHandler,来实现syncDeployment。

2.1. eventBroadcaster

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

2.2. rsControl

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

2.3. Informer().AddEventHandler

添加dInformer、rsInformer、podInformer的ResourceEventHandlerFuncs,其中主要为AddFunc、UpdateFunc、DeleteFunc三类方法。

2.4. Informer.Lister()

调用dInformer、rsInformer和podInformer的Lister()方法。

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调用了processNextWorkItem,processNextWorkItem最终调用了syncHandler,而syncHandler在NewDeploymentController中赋值的具体函数为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类型执行rolloutRecreate或rolloutRolling。

完整代码如下:

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主要包括NewDeploymentController和DeploymentController.Run两部分。

NewDeploymentController主要构建DeploymentController结构体。

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

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

  2. 初始化赋值rsControl、clientset、workqueue。

  3. 添加dInformer、rsInformer、podInformer的ResourceEventHandlerFuncs,其中主要为AddFunc、UpdateFunc、DeleteFunc三类方法。

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

  5. 赋值syncHandler,来实现syncDeployment。

DeploymentController.Run主要包含WaitForCacheSync和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类型执行rolloutRecreate或rolloutRolling。

参考:

最后更新于