摘要:深入了解 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 或使用 PodTopologySpread、NodeAffinity 等资源字段实现。Kubernetes 1.25+ 推荐使用 SchedulingProfile 配置。
九、总结
| 组件 | 职责 |
|---|---|
| API Server | 集群唯一入口,负责认证、授权、准入控制与数据代理 |
| etcd | 分布式键值存储,保存集群所有状态 |
| Scheduler | 根据调度策略选择 Pod 运行节点 |
| Controller Manager | 运行各类控制器,实现控制循环与自愈 |