2. Kubernetes 架构回顾:API Server、etcd、kubelet、Controller Manager、Scheduler 的职责

在深入准入控制策略之前,必须清晰理解 Kubernetes 控制面的核心组件及其交互方式。准入控制插件作为 API Server 的拦截层,其行为直接影响所有组件的工作流。以下是对五大核心组件的职责回顾,重点突出它们在 Deployment 滚动更新 场景中的角色。

2.1 核心组件职责总览

组件 核心职责 滚动更新中的关键行为
API Server 所有 REST 操作的入口;认证、授权、准入控制;etcd 的唯一操作者 接收 Deployment 更新请求,执行准入控制链,将新 ReplicaSet 写入 etcd
etcd 分布式键值存储;集群状态的一致性与持久化 存储 Deployment、ReplicaSet、Pod 等资源的最新版本;Watch 机制驱动后续组件
Controller Manager 运行各种控制器(Deployment、ReplicaSet、Node 等);通过 Informer 监听 etcd 变化 Deployment Controller 检测到更新,创建/缩放 ReplicaSet;ReplicaSet Controller 创建/删除 Pod
Scheduler 为未调度的 Pod 分配最优 Node;基于资源、约束、亲和性等策略 为新 Pod 选择节点,更新 Pod 的 nodeName 字段
kubelet 每个 Node 上的代理;管理 Pod 生命周期(创建、监控、销毁) 接收调度后的 Pod 声明,拉取镜像、启动容器、上报状态

2.2 组件交互流程(滚动更新场景)

下图展示了用户执行 kubectl set image deployment/nginx nginx=nginx:1.25 后,各组件如何协同完成一次滚动更新。准入控制插件在步骤 2 中作为 API Server 的中间件执行。

Deployment 滚动更新:核心组件交互流程 用户 / kubectl API Server 准入控制链 etcd Controller Manager Scheduler kubelet (Node) 1. PATCH Deployment 2. 执行准入 3. 写入新版本 4. Watch 通知 5. 创建新 ReplicaSet 6. Watch 未调度 Pod 7. 写入 nodeName 8. Watch 调度到本 Node 的 Pod 9. 上报 Pod 状态 说明:准入控制插件在步骤 2 中拦截请求,可修改(Mutating)或验证(Validating)Deployment 的 PodTemplate。步骤 5、7、9 均会再次触发 API Server 的准入控制链。

2.3 组件职责深度解析

2.3.1 API Server(kube-apiserver)

  • 唯一入口:所有对集群状态的查询和变更都必须通过 API Server。kubectl、Dashboard、Controller Manager、kubelet 均通过 REST API 与其通信。
  • 请求处理三阶段:认证(Authentication)→ 授权(Authorization)→ 准入控制(Admission Control)。准入控制是修改/验证请求的最后一道关卡。
  • etcd 操作者:只有 API Server 可以直接读写 etcd。其他组件通过 Watch 机制感知状态变化,而非直接操作存储。
  • 滚动更新相关:当用户更新 Deployment 的 spec.template 时,API Server 将新版本写入 etcd,并触发所有 Watch 该资源的控制器。

2.3.2 etcd

  • 强一致性:基于 Raft 协议保证数据一致性。所有集群配置和状态都存储在 etcd 中。
  • Watch 机制:组件通过 HTTP/2 长连接监听 etcd 中特定 key 的变化,实现事件驱动。这是 Kubernetes 控制面“声明式”运作的基础。
  • 滚动更新相关:存储 Deployment 的 spec 和 status、ReplicaSet 的 spec.replicas、Pod 的 spec.nodeName 等关键数据。

2.3.3 Controller Manager(kube-controller-manager)

  • 控制器集合:包含 Deployment Controller、ReplicaSet Controller、Node Controller、Service Controller 等 30+ 控制器。
  • 调谐循环(Reconciliation Loop):每个控制器通过 Informer 监听 etcd 变化,将当前状态调谐至期望状态。
  • 滚动更新相关:
    • Deployment Controller:检测到 Deployment 更新后,创建新的 ReplicaSet,并逐步调整新旧 ReplicaSet 的副本数。
    • ReplicaSet Controller:根据 ReplicaSet 的 spec.replicas 创建或删除 Pod。

2.3.4 Scheduler(kube-scheduler)

  • 调度决策:为未调度的 Pod(spec.nodeName 为空)选择最优 Node。决策基于资源请求、节点亲和性、污点容忍、拓扑分布约束等。
  • 两阶段调度:过滤(Predicates)→ 打分(Priorities)。过滤阶段排除不满足条件的 Node,打分阶段对剩余 Node 排序。
  • 滚动更新相关:新 Pod 创建后,Scheduler 为其分配 Node。如果集群资源不足,新 Pod 可能处于 Pending 状态,影响滚动更新进度。

2.3.5 kubelet

  • 节点代理:每个 Node 上运行,负责管理 Pod 生命周期。通过 API Server 的 Watch 接口获取分配到本 Node 的 Pod 声明。
  • 容器运行时接口(CRI):调用容器运行时(如 containerd、CRI-O)创建/启动/停止容器。
  • 健康检查与状态上报:执行存活探针(livenessProbe)和就绪探针(readinessProbe),定期向 API Server 上报 Pod 状态。
  • 滚动更新相关:kubelet 负责启动新版本 Pod 并停止旧版本 Pod。就绪探针失败会导致新 Pod 不被视为 Ready,从而阻止滚动更新继续。

2.4 组件间通信协议与端口

通信方向 协议 默认端口 说明
用户 → API Server HTTPS 6443 kubectl、Dashboard、CI/CD 系统
API Server → etcd gRPC/HTTP 2379, 2380 2379 客户端通信,2380 集群通信
Controller Manager → API Server HTTPS 10257 安全端口,通过 ServiceAccount 认证
Scheduler → API Server HTTPS 10259 安全端口,通过 ServiceAccount 认证
kubelet → API Server HTTPS 10250 kubelet 主动连接 API Server 进行 Watch 和状态上报
API Server → kubelet HTTPS 10250 用于 exec、logs、port-forward 等子资源访问
关键理解: 准入控制插件运行在 API Server 进程中,因此它可以拦截所有写入 etcd 的请求。在滚动更新场景中,无论是用户直接更新 Deployment,还是 Controller Manager 创建 ReplicaSet/Pod,都会经过准入控制链。这意味着一个设计良好的准入策略可以统一控制 Pod 的安全上下文、资源限制、镜像来源等属性,而无需修改每个控制器或用户的 YAML。

2.5 组件故障对滚动更新的影响

  • API Server 不可用:所有操作停止,包括 kubectl、控制器调谐、kubelet 状态上报。滚动更新无法发起或继续。
  • etcd 不可用:API Server 无法读写数据,集群进入只读或不可用状态。滚动更新无法进行。
  • Controller Manager 不可用:Deployment Controller 和 ReplicaSet Controller 停止工作。已发起的滚动更新会暂停,新旧 Pod 数量保持不变。
  • Scheduler 不可用:新 Pod 无法被调度,始终处于 Pending 状态。滚动更新会因 maxSurge 和 maxUnavailable 策略而阻塞。
  • kubelet 不可用:该 Node 上的 Pod 状态无法更新,新 Pod 无法启动,旧 Pod 无法停止。滚动更新可能超时或回滚。
生产建议: 在实施准入控制策略时,务必考虑控制面组件的高可用部署。API Server 和 etcd 应至少 3 副本,Controller Manager 和 Scheduler 应启用 leader election。准入控制插件本身也应经过充分测试,避免因插件 panic 导致 API Server 响应延迟或拒绝合法请求。