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、PVCProtectionControllerstartDeploymentController主要调用的函数为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的操作。
主要流程如下:
通过
SplitMetaNamespaceKey获取namespace和deployment对象的name。调用Lister的接口获取的deployment的对象。
getReplicaSetsForDeployment获取deployment管理的ReplicaSet对象。getPodMapForDeployment获取deployment管理的pod,基于ReplicaSet来分组。checkPausedConditions检查deployment是否是pause状态并添加合适的condition。isScalingEvent检查deployment的更新是否来自于一个scale的事件,如果是则执行scale的操作。根据
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结构体。
该部分主要处理了以下逻辑:
构建并运行事件处理器
eventBroadcaster。初始化赋值
rsControl、clientset、workqueue。添加
dInformer、rsInformer、podInformer的ResourceEventHandlerFuncs,其中主要为AddFunc、UpdateFunc、DeleteFunc三类方法。构造deployment、rs、pod的Informer的Lister函数和HasSynced函数。
赋值
syncHandler,来实现syncDeployment。
DeploymentController.Run主要包含WaitForCacheSync和syncDeployment两部分。
syncDeployment基于给定的key执行sync deployment的操作。
主要流程如下:
通过
SplitMetaNamespaceKey获取namespace和deployment对象的name。调用Lister的接口获取的deployment的对象。
getReplicaSetsForDeployment获取deployment管理的ReplicaSet对象。getPodMapForDeployment获取deployment管理的pod,基于ReplicaSet来分组。checkPausedConditions检查deployment是否是pause状态并添加合适的condition。isScalingEvent检查deployment的更新是否来自于一个scale的事件,如果是则执行scale的操作。根据
DeploymentStrategyType类型执行rolloutRecreate或rolloutRolling。
参考:
最后更新于
这有帮助吗?