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事件

  1. Watch资源对象的Add、Update、Delete事件并且缓存资源对象

    控制器通过K8s的Informer、Watch机制,监听集群中资源对象的Add、Update、Delete事件,为不同的事件注册不同的回调函数,并且将监听的资源缓存对象在Informer中

  2. 将资源对象的Key加入到工作队列中

    Informer在监听到资源对象的Add、Update、Delete事件之后的调用注册的回调函数,而回调函数会将相关资源对象的Key加入到工作队列中。Key是一个字符串,通常格式为{namespace}/{name}

  3. Worker协程丛工作队列中取出Key

    每个控制器的Worker协程会就持续丛工作队列中取出Key。当工作队列中加入新的Key后,就会被Worker协程取出

  4. Worker协程根据Key获取完整的资源对象

    Worker协程从工作队列中获取Key后,根据Key从Informer缓存中获取完整的资源对象。Informer一直在监听资源对象的变化,因此缓存的总是最新的资源对象版本。控制器将Key而非资源对象本身加入工作队列,可以使用Worker协程总是以最新的资源版本以准进调谐

  5. Worker协程执行资源对象Reconcile调协

    Worker协程在获取完整的资源对象后,开始执行资源对象Reconcile调谐

  6. 更新资源对象的状态

    在Worker执行的最后,如果同步的资源对象已经达到期望状态,控制器会通知工作队列丢弃该资源对象的Key;

    如果没有到达到期望状态,或者同步出现问题,就会重新放回到工作队列中

  • kube-controller-manager有很多控制器,但是每个控制器有独立的启动参数、工作队列和Worker协程,但是共享一套Informer
  • 一些资源对象的Informer可能被多个控制器注册了回调函数,所以此刻,Informer只向kube-apiserver发起一个Wacth连接
  • 控制器会启动多个Worker协程,但是共享一个工作队列,工作队列含有去重,保证了同一个资源对象不会同时被多个Worker处理