kubernetes_controller_manager

k8s-Controller-Manager

Controller Manager 是 Kubernetes(K8S)中的一个核心组件,负责管理和运行各种控制器(Controllers)。控制器是 Kubernetes 的自动化机制之一,Controller Manager 通过与 API Server 的交互来获取和更新集群的状态信息。它使用 Kubernetes 的 watch API 来实时监控资源的变化,并根据这些变化执行相应的操作。

控制器的工作流程

Informer 和 Lister 的关系

Informer内部通过Store(基于cache.FIFOcache.RateLimiter)存储资源对象数据,而Lister的接口实现(如GridLister直接读取Informer的Store,因此Lister是Informer数据的查询接口

Informer负责实时监听API Server变更(通过ListAndWatch机制),将资源变化事件(Add/Update/Delete)写入Store并触发处理链。

Lister提供快照式查询能力(如List()Get()),通过直接访问Informer的Store实现低延迟查询,避免每次直接调用API Server。

1. 核心组件与流程

  • Lister

    • 提供 List() 接口获取资源对象的全量快照(如 ListPods())。
    • 通过 InformerLister() 方法获取,确保与缓存数据同步。
    • 实现:基于 Reflector 的初始 List 操作,结合 Informer 缓存。
  • Informer

    • 核心:SharedIndexInformer(实现 Informers 接口)。
    • 机制
      1. List+Watch:通过 API Server 获取资源初始列表(List)并建立 Watch 长连接(Watch)。
      2. 缓存:本地缓存资源对象(线程安全,通过 DeltaFIFOStore 实现)。
      3. 事件分发:将 Watch 到的事件(Add/Update/Delete)传递给 ResourceEventHandler
  • EventHandler

    • 定义事件处理逻辑:
      1
      2
      3
      4
      5
      type ResourceEventHandler interface {
      OnAdd(obj interface{})
      OnUpdate(oldObj, newObj interface{})
      OnDelete(obj interface{})
      }
    • 关键点
      • Update 事件需通过 obj.DeepCopy() 避免直接操作缓存对象。
      • Delete 事件可能携带 gracePeriod,需处理最终状态。
  • Enqueue 到 WorkQueue

    • KeyFunc:生成队列键(如 controller.KeyFunc 默认使用 <namespace>/<name>)。
    • Enqueue:将键加入 workqueue.RateLimitingInterface(如 NewRateLimitingQueue)。
    • RateLimiter
      • 配置指数退避算法(如 ExponentialBackoff),失败任务重试间隔随失败次数指数增长。
      • 通过 workqueue.NewMaxHeapRateLimiter 设置最大/最小重试间隔。

2. Worker 处理流程

  • Goroutine
    • 启动多个 worker 从队列中 Dequeue() 任务。
    • 关键逻辑
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      func worker() {
      for {
      key := queue.Get()
      obj, exists := store.GetByKey(key)
      if !exists { // 对象已删除
      queue.Forget(key)
      continue
      }
      if err := process(obj) {
      if err == ErrTooEarly { // 需重试
      queue.AddRateLimited(key)
      } else {
      queue.Forget(key)
      }
      } else {
      queue.Forget(key)
      }
      }
      }
    • 指数退避
      • AddRateLimited 触发 RateLimiter 计算延迟,失败次数越多,重试间隔越长。
      • 通过 workqueue.AddAfterworkqueue.Forget 控制重试逻辑。

3. 关键机制补充

  • ReSync 机制

    • 通过 ResyncPeriod 定期强制刷新缓存(如每 30 分钟 List 一次资源)。
    • 作用:避免 Watch 断连导致的缓存不一致。
  • 并发安全

    • SharedIndexInformer 的缓存是线程安全的,但 worker 处理需自行保证业务逻辑的原子性。
    • workqueueAdd/Get 操作已原子化,但需通过 Forget/Done 管理键状态。
  • 错误处理策略

    • 永久错误(如无效配置):直接 queue.Forget,避免无限重试。
    • 临时错误(如 API 限流):通过 queue.AddRateLimited 触发指数退避。

Informer 详解


通用 Controller

Leader Election

Leader Election 的工作原理

Kubernetes 使用 分布式锁 来实现 Leader Election。具体来说,它利用了 Kubernetes 的 API Server 作为分布式锁的存储后端,通过 Lease 资源来实现选举。

关键组件

  1. Lease 资源
    • Lease 是 Kubernetes 中的一种资源类型,用于表示某个组件对 Leader 角色的持有权。
    • Lease 资源包含以下关键字段:
      • holderIdentity:当前持有锁的实例标识。
      • leaseDurationSeconds:锁的持有时间。
      • renewTime:最近一次续约的时间。
  2. 选举流程
    • 每个候选实例(Controller Manager 或 Scheduler)会尝试创建一个 Lease 资源或更新现有的 Lease 资源。
    • 如果某个实例成功创建或更新 Lease 资源,它将成为 Leader。
    • Leader 会定期更新 Lease 资源的 renewTime,以表明它仍然活跃。
    • 如果 Leader 在指定时间内未更新 Lease 资源,其他实例会认为 Leader 已失效,并尝试竞选新的 Leader。

Leader Election 的作用

  • 在 HA 环境中确保只有一个实例执行任务,避免冲突。
  • 提高系统的可靠性和容错能力。

kubernetes_controller_manager
https://mfzzf.github.io/2025/03/18/kubernetes-controller-manager/
作者
Mzzf
发布于
2025年3月18日
许可协议