1. Operator 架构总览:Controller-Manager 在 Operator 中的核心角色与数据流路径

Operator 是 Kubernetes 生态中扩展控制面的核心模式,它将领域专家的运维知识编码为自动化控制器。在 Operator 的运行时架构中,Controller-Manager 是承载所有控制器逻辑的主进程,负责监听资源变化、协调期望状态与当前状态,并驱动集群向期望状态收敛。理解 Controller-Manager 在 Operator 中的位置与数据流路径,是后续进行查询优化与样本留存的前提。

1.1 Operator 控制面的分层架构

一个典型的 Operator 控制面由三层组成:API 层、控制器层 和 执行层。Controller-Manager 位于控制器层,是 Operator 的“大脑”。

层级 组件 职责
API 层 CRD (CustomResourceDefinition) + Webhook 定义自定义资源(CR)的 schema,提供准入校验与默认值注入
控制器层 Controller-Manager (核心) 运行多个控制器,监听资源事件,执行调谐循环(Reconcile Loop)
执行层 Operator 业务逻辑(如 StatefulSet、Job、Service 的创建/更新) 通过 Kubernetes API 创建、更新或删除集群资源,实现业务意图
关键认知: Controller-Manager 并非 Operator 独有的组件,Kubernetes 原生 kube-controller-manager 也遵循相同模式。Operator 的 Controller-Manager 是这一模式的定制化实现,通常使用 controller-runtime 库构建。

1.2 Controller-Manager 的内部组件与核心角色

Controller-Manager 内部并非单一进程,而是由多个协作组件构成。每个组件在数据流路径中承担特定职责。

  • Manager:顶层协调者,负责启动所有控制器、共享缓存(Informer Cache)、客户端(Client)以及领导者选举(Leader Election)。
  • Controller:每个 CR 或内置资源对应一个控制器实例,包含调谐循环(Reconcile Loop)的核心逻辑。
  • Informer / SharedInformerFactory:通过 List & Watch 机制从 API Server 获取资源变化事件,并更新本地缓存。这是查询优化的关键入口。
  • WorkQueue:存放待调谐的资源键(Namespace/Name),支持去重、限速和重试。
  • Reconciler:用户实现的业务逻辑接口,接收请求并返回结果。
Controller-Manager 内部组件架构 Manager Controller A (CR-A) Reconciler A Controller B (CR-B) Reconciler B Controller C (内置资源) Reconciler C SharedInformerFactory (本地缓存 + Watch 流) WorkQueue (去重 / 限速 / 重试) Kubernetes API Server List & Watch

1.3 核心数据流路径:从事件到调谐

当用户创建、更新或删除一个自定义资源(CR)时,数据在 Operator 控制面中经历一条完整的路径。理解这条路径是定位性能瓶颈和设计查询优化策略的基础。

  1. 事件触发:用户通过 kubectl apply 或 API 调用向 API Server 提交 CR 变更。
  2. 准入控制:MutatingWebhook 和 ValidatingWebhook 拦截请求,执行默认值注入和校验。
  3. 持久化:API Server 将 CR 写入 etcd,并生成对应的事件通知。
  4. Watch 分发:Controller-Manager 中的 SharedInformer 通过长连接 Watch 到该事件,更新本地缓存。
  5. 入队:Informer 的事件处理器将资源键(Namespace/Name)推入 WorkQueue。
  6. 调谐循环:Reconciler 从 WorkQueue 取出键,读取最新资源状态(优先从本地缓存读取),执行业务逻辑。
  7. 回写:Reconciler 通过 Client 更新 CR 状态或创建/修改关联资源,触发新一轮事件循环。
性能关键点: 步骤 4 的本地缓存读取和步骤 5 的 WorkQueue 去重是查询优化的主战场。如果 Informer 缓存未命中或 WorkQueue 积压,将直接导致调谐延迟增加。
数据流路径:从事件到调谐 用户/API API Server Informer WorkQueue Reconciler 1. 提交 CR Webhook 3. 写入 etcd 4. Watch 事件 更新本地缓存 6. 入队 7. 调谐循环 8. 回写状态 / 创建子资源

1.4 查询优化与样本留存的切入点

基于上述数据流路径,Controller-Manager 的查询优化和样本留存可以从以下三个关键环节切入:

环节 问题 优化方向
Informer 缓存 全量 List 开销大,缓存未命中导致穿透查询 索引优化、字段选择器、标签选择器、部分对象缓存
WorkQueue 重复入队、限速策略不当导致调谐延迟 去重机制、自定义限速器、批量处理
Reconciler 调用 频繁读取关联资源,重复查询 API Server 批量读取、本地缓存复用、样本留存(保留历史状态快照)
常见误区: 很多 Operator 开发者在 Reconciler 中直接调用 r.Client.Get() 而不使用 Informer 缓存,导致每次调谐都穿透到 API Server。正确做法是优先从 Informer 的本地缓存读取,仅在缓存缺失时回源查询。

1.5 本章小结