Controller Manager 详解:Kubernetes 集群的“自动化大脑”
Controller Manager(控制器管理器)是 Kubernetes 控制平面的核心组件之一,负责运行各种 控制器(Controller),确保集群的实际状态(Actual State)始终与用户声明的期望状态(Desired State)一致。它的核心作用是 监控集群状态并自动修复偏差,是 Kubernetes 实现声明式 API 和自愈能力的关键。
1. Controller Manager 的核心作用
| 功能 | 说明 |
|---|---|
| 状态协调 | 持续监控资源(如 Pod、Deployment、Service)的实际状态,确保其符合用户定义的期望状态(YAML 声明)。 |
| 故障恢复 | 自动处理节点故障、Pod 崩溃、副本数不足等问题,保障应用高可用。 |
| 资源管理 | 管理副本集(ReplicaSet)、端点(Endpoints)、命名空间(Namespace)等资源的生命周期。 |
| 扩展支持 | 提供基础框架,允许开发者自定义控制器(Operator 模式)。 |
2. Controller Manager 的架构
Controller Manager 由 多个独立的控制器 组成,每个控制器专注于一类资源的管控:
+-----------------------+
| Controller Manager |
+-----------------------+
| Deployment Controller| → 管理 Deployment 的副本数和滚动更新
| ReplicaSet Controller| → 确保 ReplicaSet 的 Pod 副本数达标
| StatefulSet Controller| → 管理有状态应用的 Pod 和存储
| DaemonSet Controller | → 确保每个节点运行指定的 Pod(如日志收集器)
| Job Controller | → 管理一次性任务(Job/CronJob)
| Endpoints Controller | → 维护 Service 的 Endpoints(后端 Pod IP:Port)
| Namespace Controller | → 处理命名空间的创建/删除
| Node Controller | → 监控节点状态,处理节点不可用事件
| ... |
+-----------------------+注:不同 Kubernetes 版本的控制器可能略有差异。
3. 核心控制器详解
(1)Deployment Controller
- 作用:管理
Deployment资源,确保其声明的 Pod 副本数和更新策略生效。 - 典型场景:
- 当用户修改
Deployment的replicas时,控制器会自动创建或删除 Pod。 - 当用户更新
Deployment的镜像版本时,控制器会触发滚动更新(Rolling Update)。
- 当用户修改
(2)ReplicaSet Controller
- 作用:确保
ReplicaSet的当前 Pod 数量与spec.replicas一致。 - 与 Deployment 的关系:
Deployment通过管理ReplicaSet间接控制 Pod。- 滚动更新时,
Deployment会创建新的ReplicaSet,逐步替换旧的。
(3)StatefulSet Controller
- 作用:管理有状态应用(如数据库),确保 Pod 的唯一性和持久化存储的绑定。
- 特性:
- Pod 名称具有固定序号(如
mysql-0、mysql-1)。 - 持久化卷(PVC)会随 Pod 自动创建/绑定。
- Pod 名称具有固定序号(如
(4)DaemonSet Controller
- 作用:确保所有(或部分)节点运行一个指定的 Pod(如日志收集组件
fluentd)。 - 典型场景:
apiVersion: apps/v1
kind: DaemonSet
spec:
template:
spec:
containers:
- name: fluentd
image: fluentd:latest(5)Endpoint Controller
- 作用:监控
Service和Pod的变化,更新Endpoints对象(记录 Service 后端 Pod 的 IP)。 - 关键流程:
- 用户创建
Service并指定selector(如app: nginx)。 - Endpoint Controller 发现匹配的 Pod,将其 IP 和端口写入
Endpoints。 kube-proxy根据Endpoints更新 iptables/IPVS 规则。
- 用户创建
(6)Node Controller
- 作用:监控节点(Node)状态,处理节点故障。
- 典型行为:
- 当节点失联(如宕机)时,标记节点为
NotReady。 - 若失联超过
--node-monitor-grace-period(默认 40s),开始驱逐该节点上的 Pod。
- 当节点失联(如宕机)时,标记节点为
4. Controller Manager 的工作流程
以 Deployment 创建 Pod 为例:
- 用户提交 Deployment YAML:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 3
template:
spec:
containers:
- name: nginx
image: nginx:latest- API Server 接收请求并写入 etcd。
- Deployment Controller 检测到新对象:
- 创建对应的
ReplicaSet。
- 创建对应的
- ReplicaSet Controller 发现新对象:
- 检查当前 Pod 数量(0)与期望值(3)的差异。
- 调用 API Server 创建 3 个 Pod。
- Scheduler 分配节点:
- 将未调度的 Pod 绑定到合适的节点。
- kubelet 创建 Pod:
- 在目标节点上启动容器。
- Controller Manager 持续监控:
- 如果某个 Pod 崩溃,
ReplicaSet Controller会重新创建它。
- 如果某个 Pod 崩溃,
5. Controller Manager 的配置参数
Controller Manager 的启动参数(通常位于 /etc/kubernetes/manifests/kube-controller-manager.yaml):
| 参数 | 作用 | 示例 |
|---|---|---|
--cluster-name | 集群名称 | --cluster-name=my-cluster |
--node-monitor-period | 节点状态检查间隔 | --node-monitor-period=5s |
--node-monitor-grace-period | 节点失联后标记为不可用的等待时间 | --node-monitor-grace-period=40s |
--pod-eviction-timeout | Pod 驱逐超时时间 | --pod-eviction-timeout=5m |
--controllers | 指定启用的控制器列表 | --controllers=*,bootstrapsigner,tokencleaner |
6. 常见问题排查
(1)如何查看 Controller Manager 日志?
kubectl logs -n kube-system kube-controller-manager-<pod-id>注:如果是静态 Pod(如 kubeadm 部署),需直接查看节点上的日志:
journalctl -u kube-controller-manager -f(2)控制器未生效的可能原因
- API Server 通信失败:检查 Controller Manager 到 API Server 的网络连通性。
- 权限不足:确保 Controller Manager 的 ServiceAccount 有足够 RBAC 权限。
- 资源冲突:如
ReplicaSet的selector匹配了无关的 Pod。
(3)如何手动触发控制器协调?
删除资源后,控制器会自动重建:
kubectl delete pod nginx-xxxxx --force7. 总结
| 关键点 | 说明 |
|---|---|
| 角色 | Kubernetes 的“自动化大脑”,负责维护集群状态。 |
| 核心机制 | 通过控制器循环(Reconciliation Loop)比较实际状态与期望状态。 |
| 核心控制器 | Deployment、ReplicaSet、StatefulSet、DaemonSet、Endpoint、Node 等。 |
| 高可用 | 通常以多副本运行,通过 Leader 选举(—leader-elect=true)避免冲突。 |
| 扩展性 | 可结合自定义控制器(Operator)实现复杂业务逻辑。 |
Controller Manager 是 Kubernetes 实现“自愈”能力的核心,它让用户只需声明“想要什么”,而无需关心“如何实现”。