2. 控制面架构基础:Kubernetes 控制面组件及其职责

Kubernetes 控制面(Control Plane)是集群的“大脑”,负责维护集群的期望状态、调度工作负载、响应集群事件以及管理所有 API 请求。理解控制面各组件的职责与协作关系,是掌握 Operator SDK 驱动控制面适配的前提。Operator 本质上是通过扩展 API Server 和 Controller Manager 的能力来实现自定义资源的管理。

2.1 控制面核心组件总览

Kubernetes 控制面由四个核心组件构成,它们通常运行在独立的 Master 节点上(生产环境建议高可用部署)。下表总结了各组件的核心功能与通信方式:

组件 核心职责 通信协议/端口 数据持久化
API Server (kube-apiserver) 集群网关,认证/授权/准入控制,RESTful API 入口 HTTPS (6443) 无状态,仅与 etcd 交互
Controller Manager (kube-controller-manager) 运行核心控制器循环,调节集群状态至期望状态 HTTPS (10257) 通过 API Server 读写
Scheduler (kube-scheduler) 为新创建的 Pod 选择最优节点 HTTPS (10259) 通过 API Server 读取
etcd 分布式键值存储,保存所有集群数据 gRPC (2379/2380) 磁盘持久化(Raft 共识)
Operator 视角: Operator 主要与 API Server 和 Controller Manager 交互。API Server 提供 CRD(Custom Resource Definition)的注册与查询接口;Controller Manager 运行 Operator 的控制器逻辑,监听自定义资源的变化。

2.2 API Server:集群的单一入口

API Server 是 Kubernetes 控制面的前端,所有对集群状态的查询和变更都必须经过它。它负责以下关键职责:

  • 认证(Authentication): 验证请求发起者的身份(客户端证书、、用户名/密码等)。
  • 授权(Authorization): 基于 RBAC、ABAC 或 Webhook 判断请求者是否有权限执行操作。
  • 准入控制(Admission Control): 在对象持久化之前,通过一系列准入插件(Mutating 和 Validating)修改或验证请求。
  • RESTful API 服务: 提供标准的 HTTP REST 接口,支持 CRUD 操作(GET、POST、PUT、DELETE、PATCH)。
  • etcd 交互: 作为唯一与 etcd 直接通信的组件,将集群状态序列化后存储。

API Server 采用无状态设计,可以水平扩展。所有组件(包括 Scheduler、Controller Manager、kubelet、kube-proxy 以及 Operator)都通过 API Server 进行通信,避免了组件间的直接耦合。

关键点: Operator SDK 生成的 Operator 通过 client-go 库与 API Server 交互。Operator 的控制器会监听 API Server 上的自定义资源事件(Add/Update/Delete),并触发相应的调谐逻辑。

2.3 Controller Manager:状态调节引擎

Controller Manager 是控制面中运行控制器循环的核心组件。它内部包含多个内置控制器(如 Node Controller、Replication Controller、Endpoint Controller、Service Account Controller 等),每个控制器负责将集群的实际状态调节至用户定义的期望状态。

控制器的工作模式遵循“观察-分析-行动”循环:

  1. 观察(Watch): 通过 API Server 的 Watch 接口监听特定资源的变化。
  2. 分析(Analyze): 比较当前状态与期望状态,计算差异。
  3. 行动(Act): 调用 API Server 的接口创建、更新或删除资源,以消除差异。

Operator 本质上是一个自定义控制器,它扩展了 Controller Manager 的能力。Operator SDK 帮助开发者快速构建这种自定义控制器,使其能够监听自定义资源并执行业务逻辑。

注意: 不要将 Controller Manager 与 Operator 的控制器混淆。Controller Manager 是 Kubernetes 内置的控制器集合,而 Operator 的控制器是用户自定义的、运行在 Pod 中的独立进程。Operator 控制器通过 API Server 与 Controller Manager 协作,但彼此独立运行。

2.4 Scheduler:Pod 调度决策者

Scheduler 负责为新创建的 Pod(尚未分配到节点)选择最合适的节点。它通过以下两步完成调度:

  • 过滤(Filtering): 排除不满足 Pod 资源请求、节点亲和性、污点容忍等条件的节点。
  • 打分(Scoring): 对剩余节点进行优先级排序,选择得分最高的节点。

Scheduler 的决策结果通过 API Server 写入 Pod 的 spec.nodeName 字段。Operator 通常不直接与 Scheduler 交互,但 Operator 创建的工作负载(如 Deployment、StatefulSet)最终会由 Scheduler 调度到具体节点。

2.5 etcd:集群状态持久化基石

etcd 是一个分布式、强一致性的键值存储系统,基于 Raft 共识算法实现高可用。它存储了 Kubernetes 集群的所有配置数据、状态数据和元数据,包括:

  • 所有 API 对象(Pod、Service、ConfigMap、Secret、CRD 等)的定义和状态。
  • 集群的配置信息(如网络策略、RBAC 规则)。
  • 集群的当前状态(如节点健康状态、资源使用情况)。

etcd 是控制面的“单点真相源”(Single Source of Truth)。API Server 是唯一直接读写 etcd 的组件,其他组件(包括 Operator)只能通过 API Server 间接访问 etcd。

Operator 影响: Operator 创建的自定义资源(CR)实例也会存储在 etcd 中。因此,etcd 的性能和可用性直接影响 Operator 的响应速度和可靠性。在生产环境中,etcd 应部署为 3 或 5 节点的集群,并使用 SSD 磁盘。

2.6 控制面组件协作流程

下图展示了用户通过 kubectl 创建一个 Deployment 时,控制面各组件的协作流程:

控制面组件协作流程(创建 Deployment) kubectl API Server etcd Controller Manager Scheduler kubelet Pod POST 存储 Watch 通知 Deployment 创建事件 创建 ReplicaSet Pod 待调度 绑定节点 Pod 调度结果 启动容器 流程说明 1. kubectl 发送 POST 请求 2. API Server 验证并存储到 etcd 3. Controller Manager 创建 ReplicaSet 4. Scheduler 为 Pod 选择节点 5. kubelet 在节点上启动 Pod

2.7 控制面组件与 Operator 的关系

Operator 作为控制面的扩展,与各组件的交互关系如下:

  • API Server: Operator 通过 API Server 注册 CRD、监听自定义资源事件、读写自定义资源实例。这是 Operator 与控制面交互的主要通道。
  • Controller Manager: Operator 的控制器逻辑独立运行,但遵循与 Controller Manager 相同的“调谐循环”模式。Operator SDK 封装了控制器循环的样板代码。
  • Scheduler: Operator 通常不直接调度 Pod,但可以通过设置节点亲和性、污点容忍等字段影响调度决策。
  • etcd: Operator 不直接访问 etcd,所有数据读写都通过 API Server 完成。etcd 的稳定性直接影响 Operator 的可用性。
Operator SDK 实践: 在 Operator SDK 中,Manager 对象负责与 API Server 建立连接、注册控制器和 Webhook。控制器通过 Reconcile 函数实现调谐逻辑,该函数在每次自定义资源发生变化时被调用。Operator 的控制器本质上是一个“自定义 Controller Manager”,它扩展了 Kubernetes 控制面的能力。