Kube-controller-manager(OverView)
Kube-controller-manager(OverView)
基于1.25
什么是kube-controller-manager
K8s Controller Manager 主要由kube-controller-manager和cloud-controller-manager组件组成。它们通过监控集群中资源对象的变化,确保资源对象从当前状态到期望状态
控制器状态模型
K8s使用资源清单(mainfest),控制器通过Reconcile调谐机子把资源对象的实际状态更新为期望状态
- Spec:记录期望状态
- Status:实际状态
控制器执行原理
kube-controller-manager运行了多个控制器。控制器通过Informer机制监听资源对象的Add、Update、Delete事件
Watch资源对象的Add、Update、Delete事件并且缓存资源对象
控制器通过K8s的Informer、Watch机制,监听集群中资源对象的Add、Update、Delete事件,为不同的事件注册不同的回调函数,并且将监听的资源缓存对象在Informer中
将资源对象的Key加入到工作队列中
Informer在监听到资源对象的Add、Update、Delete事件之后的调用注册的回调函数,而回调函数会将相关资源对象的Key加入到工作队列中。Key是一个字符串,通常格式为{namespace}/{name}
Worker协程丛工作队列中取出Key
每个控制器的Worker协程会就持续丛工作队列中取出Key。当工作队列中加入新的Key后,就会被Worker协程取出
Worker协程根据Key获取完整的资源对象
Worker协程从工作队列中获取Key后,根据Key从Informer缓存中获取完整的资源对象。Informer一直在监听资源对象的变化,因此缓存的总是最新的资源对象版本。控制器将Key而非资源对象本身加入工作队列,可以使用Worker协程总是以最新的资源版本以准进调谐
Worker协程执行资源对象Reconcile调协
Worker协程在获取完整的资源对象后,开始执行资源对象Reconcile调谐
更新资源对象的状态
在Worker执行的最后,如果同步的资源对象已经达到期望状态,控制器会通知工作队列丢弃该资源对象的Key;
如果没有到达到期望状态,或者同步出现问题,就会重新放回到工作队列中
- kube-controller-manager有很多控制器,但是每个控制器有独立的启动参数、工作队列和Worker协程,但是共享一套Informer
- 一些资源对象的Informer可能被多个控制器注册了回调函数,所以此刻,Informer只向kube-apiserver发起一个Wacth连接
- 控制器会启动多个Worker协程,但是共享一个工作队列,工作队列含有去重,保证了同一个资源对象不会同时被多个Worker处理