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 的中间件执行。
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 响应延迟或拒绝合法请求。