Kubernetes 控制平面(Control Plane)是集群的"大脑",负责管理和控制整个集群的状态。它由多个组件组成,每个组件都有特定的职责。
控制平面组件
1. API Server(kube-apiserver)
API Server 是 Kubernetes 控制平面的核心组件,是集群的统一入口。
主要职责:
- 提供 REST API 接口,供用户、其他组件和外部系统调用
- 验证和配置 API 对象的数据(如 Pod、Service、Deployment)
- 处理认证、授权和准入控制
- 作为 etcd 的唯一客户端,所有数据读写都通过 API Server
特点:
- 无状态设计,可以水平扩展
- 默认监听 6443 端口(HTTPS)
- 支持 Swagger/OpenAPI 文档
2. etcd
etcd 是 Kubernetes 的分布式键值存储,用于存储集群的所有配置和状态数据。
主要职责:
- 存储集群状态数据
- 提供数据一致性和可靠性保证
- 支持分布式部署和故障恢复
特点:
- 基于 Raft 一致性算法
- 支持事务和 Watch 机制
- 默认使用 2379(客户端)和 2380(集群通信)端口
最佳实践:
- 定期备份 etcd 数据
- 使用 TLS 加密通信
- 配置合理的资源限制
3. Scheduler(kube-scheduler)
Scheduler 负责将新创建的 Pod 分配到合适的 Node 上运行。
主要职责:
- 监听未调度的 Pod
- 根据调度策略选择最优的 Node
- 将调度结果写入 API Server
调度流程:
- 过滤(Predicates):排除不满足条件的 Node
- 打分(Priorities):对满足条件的 Node 进行评分
- 选择:选择得分最高的 Node
调度策略:
- 资源请求和限制
- 节点选择器(nodeSelector)
- 亲和性和反亲和性(Affinity/Anti-Affinity)
- 污点和容忍度(Taints and Tolerations)
- 节点资源利用率
4. Controller Manager(kube-controller-manager)
Controller Manager 运行多个控制器,这些控制器负责维护集群的期望状态。
主要控制器:
-
Node Controller:
- 监控 Node 状态
- 在 Node 不可用时标记为 NotReady
- 在 Node 故障时驱逐 Pod
-
Replication Controller:
- 确保 Pod 副本数符合期望值
- 创建或删除 Pod 以维持副本数
-
Endpoints Controller:
- 维护 Service 和 Pod 的对应关系
- 更新 Endpoint 对象
-
Service Account & Token Controller:
- 为新的 Namespace 创建默认 ServiceAccount
- 管理 API 访问令牌
-
Deployment Controller:
- 管理 Deployment 的滚动更新
- 创建和更新 ReplicaSet
-
StatefulSet Controller:
- 管理 StatefulSet 的 Pod 生命周期
- 维护 Pod 的稳定标识
-
DaemonSet Controller:
- 确保在每个 Node 上运行一个 Pod 副本
-
Job Controller:
- 管理一次性任务
- 确保任务成功完成
-
CronJob Controller:
- 管理定时任务
- 根据时间表创建 Job
特点:
- 每个控制器独立运行
- 使用 Watch 机制监听资源变化
- 通过 API Server 更新资源状态
5. Cloud Controller Manager(cloud-controller-manager)
Cloud Controller Manager 是云提供商特定的控制器,用于将 Kubernetes 与云平台集成。
主要职责:
- 管理云提供商的 Node 生命周期
- 管理云路由
- 管理云存储卷
- 管理服务负载均衡器
优势:
- 将云相关逻辑与 Kubernetes 核心分离
- 提高代码可维护性
- 便于支持多个云提供商
控制平面工作流程
-
用户请求:用户通过 kubectl 或 API 发送请求到 API Server
-
认证授权:API Server 验证用户身份和权限
-
数据存储:API Server 将数据写入 etcd
-
控制器监听:各控制器通过 Watch 机制监听资源变化
-
状态协调:控制器根据期望状态协调实际状态
-
调度决策:Scheduler 为未调度的 Pod 选择 Node
-
状态更新:控制器和 Scheduler 将更新结果写回 API Server
高可用部署
为了提高控制平面的可用性,建议:
- API Server:部署多个实例,使用负载均衡器
- etcd:部署奇数个节点(3、5、7),使用堆叠或外部 etcd 拓扑
- Scheduler 和 Controller Manager:部署多个实例,使用 Leader 选举
监控和调试
- 查看组件状态:
bashkubectl get componentstatuses
- 查看 Pod 日志:
bashkubectl logs -n kube-system kube-apiserver-xxx
- 查看事件:
bashkubectl get events -n kube-system
最佳实践
-
资源限制:为控制平面组件设置合理的 CPU 和内存限制
-
安全加固:
- 启用 RBAC
- 使用 TLS 加密通信
- 限制 API Server 访问
-
备份策略:定期备份 etcd 数据
-
监控告警:监控控制平面组件的健康状态
-
版本升级:遵循 Kubernetes 版本升级策略,逐步升级
-
日志管理:集中收集和分析控制平面日志