控制平面组件详解:API Server、etcd、Scheduler 与 Controller Manager

摘要:深入了解 Kubernetes 控制平面的四大核心组件:API Server、etcd、Scheduler、Controller Manager 的工作原理和协作方式。

一、控制平面组件总览

控制平面(Control Plane)是 Kubernetes 集群的管理层,负责集群状态存储、调度决策和编排逻辑。所有组件均通过 API Server 间接或直接交互。
控制平面
kube-apiserver

集群唯一入口
etcd

分布式键值存储
Scheduler

调度器
Controller Manager

控制器管理器
cloud-controller-manager

云控制器(可选)

上图展示了控制平面的核心架构:kube-apiserver 作为集群唯一入口,负责认证、授权、准入控制以及请求转发;etcd 存储集群状态;Scheduler 负责 Pod 调度;Controller Manager 运行各类控制器;云环境下可启用 cloud-controller-manager 对接云厂商 API。

二、kube-apiserver --- 集群入口与通信枢纽

2.1 职责

API Server 是整个 K8s 集群的唯一入口,所有操作都必须经过它。
kube-apiserver 职责
RESTful API 网关

提供 HTTP/HTTPS API
安全层

认证 / 授权 / 准入控制
数据代理

唯一可读写 etcd 的组件
事件通知

Watch 机制推送状态变化

API Server 具有四大核心职责:作为 RESTful API 网关提供统一接口;执行认证、授权与准入控制;作为 etcd 的唯一访问层;通过 Watch 机制向其他组件推送资源变更。

2.2 请求处理流程

客户端请求在 API Server 内依次经过认证、授权、准入控制,最后持久化到 etcd。
kubectl / 客户端
kube-apiserver
① 认证 Authentication

证书 / Token / 用户名密码
② 授权 Authorization

RBAC / ABAC / Webhook
③ 准入控制 Admission Control

变更 / 验证 Webhook
④ 持久化

写入 etcd

上述流程保证:先确认请求者身份(认证)、再判断是否被允许执行该操作(授权)、最后校验请求内容是否符合策略(准入控制),通过后再写入 etcd。

2.3 Watch 机制

Watch 是 K8s 实现事件驱动架构的核心机制,各组件通过长期连接订阅资源变更,无需轮询。
Watch /pods
Watch /pods
Watch /nodes
API Server
Watch 资源变更
kubelet
Scheduler
Controller Manager

当 Pod、Node 等资源发生变化时,API Server 通过 HTTP 长连接主动推送事件给所有 Watcher,实现实时响应。

三、etcd --- 分布式键值存储

3.1 什么是 etcd

etcd 是一个分布式键值存储数据库,存储着集群的所有状态数据。
存储内容示例
/registry/pods/default/nginx-xxx
/registry/services/default/my-svc
/registry/deployments/default/my-app
/registry/nodes/worker-1
etcd
分布式键值存储
Raft 一致性算法
gRPC 接口

etcd 使用 Raft 协议保证一致性,通过 gRPC 提供服务。存储内容包括 Pod、Service、Deployment、Node、ConfigMap、Secret 等资源的完整状态。只有 API Server 能直接访问 etcd。

3.2 etcd 的 Raft 一致性

etcd 集群采用 Raft 算法实现分布式一致性,多数节点确认后数据才可提交。
① 接收写入
② 复制到 Follower
③ 多数确认后提交
etcd-1 Leader
etcd-2 Follower
etcd-3 Follower

Raft 保证:多数节点存活时集群可正常工作。3 节点可容忍 1 个故障,5 节点可容忍 2 个故障。建议使用奇数节点以避免脑裂。

3.3 etcd 备份策略

etcd 数据丢失将导致集群状态全部丢失,必须定期备份并存储到集群外部。
定期快照
etcdctl snapshot save backup.db
建议每 30 分钟备份
存储到集群外部

使用 etcdctl snapshot save 创建快照,备份文件应存储到独立存储系统,避免与集群共用故障域。

四、kube-scheduler --- 调度器

4.1 调度流程

Scheduler 负责决定新创建的 Pod 应该运行在哪个节点上,分为过滤、打分、绑定三个阶段。
排除资源不足、不满足亲和性、污点等
对剩余节点打分 0-100
选择最高分节点
新 Pod 未调度
阶段一:过滤 Filtering
可用节点列表
阶段二:打分 Scoring
阶段三:绑定 Binding
完成调度

过滤阶段剔除不满足条件的节点(资源不足、亲和性、污点、端口冲突等);打分阶段对剩余节点评分;绑定阶段选择得分最高的节点并通知 API Server。

4.2 调度考虑因素

调度考虑因素
资源请求与限制
nodeSelector
亲和性与反亲和性
污点与容忍
资源均衡
数据局部性

Scheduler 在打分时综合考虑:CPU/内存 requests、nodeSelector、亲和性/反亲和性、污点与容忍、节点负载均衡以及数据局部性等因素。

五、kube-controller-manager --- 控制器管理器

5.1 控制循环

Controller 通过**控制循环(Reconciliation Loop)**持续确保集群实际状态与期望状态一致。


观察当前状态
是否一致?
调整实际状态

例如:Deployment 期望 3 个副本,实际仅 2 个 Pod 运行,控制器会创建 1 个新 Pod 直至实际状态与期望一致。

5.2 内置控制器

kube-controller-manager 是单一进程,内部运行多个控制器,分别负责不同资源类型。
kube-controller-manager
ReplicaSet Controller

维护 Pod 副本数
Deployment Controller

滚动更新与回滚
Node Controller

监控节点健康
Job Controller

批处理任务
Service Controller

云 LB
Endpoint Controller

维护 Service 端点

此外还包括 Namespace Controller、ServiceAccount Controller,以及 StatefulSet、DaemonSet、CronJob 等控制器。

5.3 Node Controller 工作示例

Node Controller 通过心跳超时检测节点故障,超时后标记为 Unknown,持续无心跳则驱逐该节点上的 Pod。
节点心跳正常
40s 未收到心跳
标记为 Unknown
继续等待 5 分钟
仍无心跳
驱逐 Pod 到其他节点

此流程确保在节点失联时,工作负载能及时迁移到健康节点。

六、cloud-controller-manager

在云环境(AWS、GCP、Azure)中,cloud-controller-manager 负责与云厂商 API 交互。
cloud-controller-manager
Node Controller

检查云 VM 状态
Route Controller

配置云网络路由
Service Controller

创建/管理云 LB

Node Controller 检查云上 VM 是否已被删除;Route Controller 配置路由;Service Controller 在云环境中创建 LoadBalancer 等资源。自建集群通常不需要此组件。

七、各组件协作全景

从用户创建 Deployment 到 Pod 最终运行,各组件按以下顺序协作:
用户 kubectl apply
API Server 存储 Deployment
etcd
Deployment Controller
API Server 创建 ReplicaSet
ReplicaSet Controller
API Server 创建 Pod
Scheduler
API Server 绑定 Pod 到节点
kubelet
API Server 汇报 Pod 状态

API Server 接收请求并持久化;Deployment Controller 创建 ReplicaSet;ReplicaSet Controller 创建 Pod;Scheduler 调度 Pod;kubelet 拉取镜像并启动容器,最后汇报状态。

八、常见问题

Q1:API Server 高可用如何实现?

多实例部署 API Server,通过负载均衡器将流量分发到各实例。所有实例共享同一 etcd 集群,保证状态一致。

Q2:etcd 推荐集群规模?

生产环境建议 3 或 5 个节点。单节点仅用于开发测试;7 节点及以上通常无必要,且会增加选举延迟。

Q3:如何自定义调度策略?

可通过配置 Scheduler 的 --policy-config-file 或使用 PodTopologySpreadNodeAffinity 等资源字段实现。Kubernetes 1.25+ 推荐使用 SchedulingProfile 配置。

九、总结

组件 职责
API Server 集群唯一入口,负责认证、授权、准入控制与数据代理
etcd 分布式键值存储,保存集群所有状态
Scheduler 根据调度策略选择 Pod 运行节点
Controller Manager 运行各类控制器,实现控制循环与自愈
相关推荐
A-刘晨阳3 小时前
K8S 之 Taints(污点)与 Tolerations(容忍)
运维·云原生·容器·kubernetes·k8s污点·k8s容忍
@hdd3 小时前
Kubernetes 集群架构概述
容器·架构·kubernetes
AI逐月5 小时前
Mac 轻量安装 Docker 完整指南(Docker + Colima + Kubernetes)
macos·docker·kubernetes
sanyii3131315 小时前
k8s核心资源Pod-主容器之钩子函数
云原生·容器·kubernetes
至此流年莫相忘6 小时前
Linux部署k8s(Ubuntu)
linux·ubuntu·kubernetes
识途老码6 小时前
9. k8s-ReplicaSets介绍
kubernetes·rs·replicasets
识途老码6 小时前
8.k8s-node组件介绍
kubernetes·node
没有bug.的程序员6 小时前
容器网络深度探究:从 CNI 插件选型内核到 K8s 网络策略安全防护实战指南
java·网络·安全·kubernetes·k8s·cni·容器网络
人间打气筒(Ada)6 小时前
k8s:认证、授权、准入控制
云原生·容器·kubernetes·云计算·k8s认证·k8s授权·k8s准入控制