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

Informer 和 Lister 的关系
Informer内部通过Store
(基于cache.FIFO
或cache.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()
)。 - 通过
Informer
的Lister()
方法获取,确保与缓存数据同步。 - 实现:基于
Reflector
的初始 List 操作,结合 Informer 缓存。
- 提供
Informer
- 核心:
SharedIndexInformer
(实现Informers
接口)。 - 机制:
- List+Watch:通过 API Server 获取资源初始列表(List)并建立 Watch 长连接(Watch)。
- 缓存:本地缓存资源对象(线程安全,通过
DeltaFIFO
或Store
实现)。 - 事件分发:将 Watch 到的事件(Add/Update/Delete)传递给
ResourceEventHandler
。
- 核心:
EventHandler
- 定义事件处理逻辑:
1
2
3
4
5type ResourceEventHandler interface {
OnAdd(obj interface{})
OnUpdate(oldObj, newObj interface{})
OnDelete(obj interface{})
} - 关键点:
- Update 事件需通过
obj.DeepCopy()
避免直接操作缓存对象。 - Delete 事件可能携带
gracePeriod
,需处理最终状态。
- Update 事件需通过
- 定义事件处理逻辑:
Enqueue 到 WorkQueue
- KeyFunc:生成队列键(如
controller.KeyFunc
默认使用<namespace>/<name>
)。 - Enqueue:将键加入
workqueue.RateLimitingInterface
(如NewRateLimitingQueue
)。 - RateLimiter:
- 配置指数退避算法(如
ExponentialBackoff
),失败任务重试间隔随失败次数指数增长。 - 通过
workqueue.NewMaxHeapRateLimiter
设置最大/最小重试间隔。
- 配置指数退避算法(如
- KeyFunc:生成队列键(如
2. Worker 处理流程
- Goroutine:
- 启动多个 worker 从队列中
Dequeue()
任务。 - 关键逻辑:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19func 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.AddAfter
或workqueue.Forget
控制重试逻辑。
- 启动多个 worker 从队列中
3. 关键机制补充
ReSync 机制:
- 通过
ResyncPeriod
定期强制刷新缓存(如每 30 分钟 List 一次资源)。 - 作用:避免 Watch 断连导致的缓存不一致。
- 通过
并发安全:
SharedIndexInformer
的缓存是线程安全的,但worker
处理需自行保证业务逻辑的原子性。workqueue
的Add
/Get
操作已原子化,但需通过Forget
/Done
管理键状态。
错误处理策略:
- 永久错误(如无效配置):直接
queue.Forget
,避免无限重试。 - 临时错误(如 API 限流):通过
queue.AddRateLimited
触发指数退避。
- 永久错误(如无效配置):直接
Informer 详解

通用 Controller


Leader Election
Leader Election 的工作原理
Kubernetes 使用 分布式锁 来实现 Leader Election。具体来说,它利用了 Kubernetes 的 API Server 作为分布式锁的存储后端,通过 Lease
资源来实现选举。
关键组件
- Lease 资源:
- Lease 是 Kubernetes 中的一种资源类型,用于表示某个组件对 Leader 角色的持有权。
- Lease 资源包含以下关键字段:
holderIdentity
:当前持有锁的实例标识。leaseDurationSeconds
:锁的持有时间。renewTime
:最近一次续约的时间。
- 选举流程:
- 每个候选实例(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/