Kube-controller-manager(GarbageController)
Kube-controller-manager(GarbageController)
基于1.25
GarbageController负责资源对象的级联删除(GC)
K8s中,主要通过OwnerReference来记录资源的级联关系
OwnerReference结构定义:
UID:资源对象父级资源的UID
BlockOwnerDeletion:true表示父级资源在以Foregroud删除策略执行删除(在删除这个资源之前,不可删除父资源)
GC Controller支持三种删除策略
Orphan(孤儿删除):仅删除当前资源对象,不级联删除当前资源对象的子级资源对象
Foreground(前台删除):先删除当前资源对象子对象,再删除这个对象
Backgroud(后台删除):先删除当前资源对象,再级联删除这个资源的子级对象
使用Orphan和Foreground,资源对象会被加上Finalizer,并且在删除中由GC Controller负责移除
Ref:https://github.com/kubernetes/apimachinery/blob/fdcfc2723dc ...
Kube-controller-manager(EndpointSlice)
Kube-controller-manager(EndpointSlice)
基于1.25
EndpointSlice Controller可以把巨大的Endpoints资源对象拆分成多个EndpointSlice,为了解决Endpoints资源对象
一个Service资源对象关联的所有POd地址存储在一个或者多个EndpoineSlice中
控制器初始化
Service
EndpointSlice
Pod
主要执行逻辑
c.serviceLister.Services
获取Service资源对象
c.podLister.Pods
获取Service的关联Pod
c.endpintSliceLister.EndpointSlice
获取Service关联的EndpointSlice
dropEndpointSlicesPendingDeletion
过滤删除中的EndpointSlice
c.reconclier.reconclie
计算和更新各个EndppintSlice
reconcile步骤如下:
geAddressTypesForService
获取Serv ...
Kube-controller-manager(Endpoint)
Kube-controller-manager(Endpoint)
基于1.25
Endpoint Controller主要控制Endpoint资源
Endpoints资源对象主要包含Subsets属性,用于存储同命名空间内同名称的Service资源对象关联的Pod的IP地址和端口号
Endpoints Controller为每一个Service资源对象创建一个与命名空间相同的Endpoints对象,并且在Service和Pod变化的时候,重新统计对应Service关联的Pod的IP地址和端口号,更新到Endpoints的Subsets属性中
这些地址和端口被各个节点的kube-proxy用于更新本机的iptables或ipvs
控制器初始化
Service
Endpoints
Pod
主要执行逻辑
e.serviceLister.Sevice
获取Service
e.podLister.Pods
获取Service资源对象关联的POd
For _,pod:=range pods
遍历Pod统计所有的IP地址和端口号
Endpoint Controller遍历S ...
Kube-controller-manager(CronJob)
Kube-controller-manager(CronJob)
基于1.25
CronJob Controller 操作控制CronJob
CronJob资源主要包含Job模版(Spec.JobTemplate)和计划表(Spec.Schedule)
CronJob 控制器通过资源对象的计划配置,到达预定时间后,创建新的Job对象,并且清理过去成功或者失败的Job资源对象
Spec.Schedule字段定义和Linux终端crontab一致
控制器初始化
Job资源对象
CronJob资源对象
主要执行逻辑
jm.cronJobLister.CronJobs
获取CronJob对象
getJobsToBeReconciled
获取关联的Job对象
syncCronJob
计算Job的启动时间并启动新的Job
获取当前的CronJob对象关联的Job资源对象,更新Status.Active字段,从中去掉已经执行结束的Job,加入正在执行的Job,确保Status.Active都是正在执行的Job
判断CronJob资源对象的状态。如果是删除中,或 ...
Kube-controller-manager(Job)
Kube-controller-manager(Job)
基于1.25
Job Controller是job的控制器
Job Controller会根据Job的并发(Spec.Parallelism)和完成(Spec.Completions)字段,此间一个或者多个Pod。在指定数量(Spec.Completions)的Pod执行成功之后,宣告Job成功,Job默认采用Orphan删除策略,删除Job不会主动删除其关联的Pod
控制器初始化
Job资源
Pod资源
主要执行逻辑
jm.jobLister.Jobs
获取Job资源对象
IsJobFinished
判断Job是否已经执行完成。
Job Controller检查Job.Status.Conditions状态,如果存在Complete或Failed类型的状态且值为true,则Job已经执行完成
Ref:https://github.com/kubernetes/kubernetes/blob/1504f10e7946f95a8b1da35e28e4c7453ff62775/pkg/controller/job/util ...
Kube-controller-manager(StatefulSet)
Kube-controller-manager(StatefulSet)
基于1.25
StatefulSet Controller控制器主要控制StatefulSet资源
StatefulSet资源主要包含Pod模版、副本数量(Spec.Replicas)、更新策略、管理策略等部分
StatefulSet在每个关联的Pod的Name会添加一个序号后缀
创建、删除Pod按照固定的顺序操作
当Pod超出期望的副本数量,或以执行滚动更新策略更新,控制器顺序按顺序从高到低依次删除Pod;反之,如果Pod数量低于期望副本数量,控制器低序号到高序号删除Pod
控制器初始化
StatefulSet资源对象:监听Add、Uodtaed、Delete事件
Pod资源对象
主要执行逻辑
ssc.setLister.StatefulSets
获取完整的STS对象
ssc.getPodsForStatefulSet
获取关联的Pod
syncStatefulSet
调谐StatefulSet。调用syncStatefulSet func实现STS调谐。内部主要调用了 s ...
Kube-controller-manager(DaemonSet)
Kube-controller-manager(DaemonSet)
基于1.25
DaemonSet Controller控制DaemonSet对象
DaemonSet资源对象选中的节点,最终仅仅有一个Pod处于可用
DaemonSet资源对象主要包含Pod模版、更新策略俩部分
控制器初始化
DaemonSet资源对象:监听Add、Update、Delete事件
Pod资源对象
Node资源对象
ControllerRevison资源对象:处理ControllerRevison资源对象同步,记录DS的Pod模版历史重现过的版本
主要执行逻辑
dsc.dsListener.DaemonSets
获取DS资源对象,DS Controller通过DS Informer的Lister获取完整的DS资源对象
dsc.nodeLister.List
获取集群的所有Node资源对象
ds.DeletionTimestamp !=nil
判断资源对象是否处于删除中。如果处于删除中行,不需要进行Reconcile
dsc.expections.SatisfiedExpecta ...
Kube-controller-manager(Deployment)
Kube-controller-manager(Deployment)
基于1.25
Deployment控制器主要控制Deployment资源。
Deploymen控制器依旧更新策略调整RS资源
控制器初始化Deployment控制器初始化的时候,会创建工作队列存储Deployment资源对象的Key
Deployment资源对象:监听Add、Update、Delete事件,把监听到的RS资源对象的Key加入到工作队列中,等待Worker协程消费处理
RS资源对象
Pod资源对象
主要执行逻辑
dc.Listener.Deployments
获取Deployment资源对象。通过Deployment Informer的Lister接口Get获取完整的Deployment资源对象
dc.getReconcileSetsForDeployment
获取管理的RS对象
d.DeletionTimestamp !=nil
判断是否执行Reconcile
d.Spec.Paused
判断是否暂停版本更新。当处于Paused状态时,Deployment Control ...
Kube-controller-manager(ReplicaSet)
Kube-controller-manager(ReplicaSet)
基于1.25
ReplicaSet控制器是ReplicaSet资源对象的控制器,通过Informer资源监听ReplicaSet和Pod对象,监听到Add、Update、Delete时,ReplicaSet控制器会对ReplicaSet资源对象进行Reconcile
ReplicaSet资源对象主要包含Pod模版(Spec.Template)和副本数(Spec.Replicas)
控制器初始化ReplicaSet控制器初始化的时候,会创建工作队列以存储ReplicaSet资源对象的Key。
ReplicaSet资源对象:监听Add、Update、Delete事件,把监听到的ReplicaSet资源对象的Key加入到工作队列,等待Worker协程消费
Pod资源对象:监听Add、Update、Delete事件,把监听到的Pod资源对象的Key加入到工作队列,等待Worker协程消费
Pod资源对象的OwnerReference记录了父级资源的引用
当触发了Pod的Add或Delete事件,通过OwnerRefer ...
Kube-controller-manager(启动流程)
Kube-controller-manager(启动流程)
基于1.25
kube-controller-manger的启动流程主要分:
Cobra命令行参数解析
运行EventBroadcaster事件处理器
运行HTTPS服务
执行Leader选举
启动控制器主循环
Cobra命令行参数解析
Ref:https://github.com/kubernetes/kubernetes/blob/88e994f6bf8fc88114c5b733e09afea339bea66d/cmd/kube-controller-manager/app/controllermanager.go#L100
// NewControllerManagerCommand creates a *cobra.Command object with default parametersfunc NewControllerManagerCommand() *cobra.Command { s, err := options.NewKubeControllerManagerOptions() if ...