Controller Manager 深度解析
什么是 Controller Manager
kube-controller-manager 是一个进程,内部运行着数十个控制器(Controller)。每个控制器负责一类资源的生命周期管理,通过不断的 Reconcile 循环驱动实际状态向期望状态收敛。
kube-controller-manager
├── DeploymentController
├── ReplicaSetController
├── StatefulSetController
├── DaemonSetController
├── JobController
├── CronJobController
├── NodeController
├── ServiceController
├── EndpointController
├── NamespaceController
├── PersistentVolumeController
└── ... (共 30+ 个控制器)控制循环原理
go
// 每个控制器的核心模式
func (c *DeploymentController) Run(workers int, stopCh <-chan struct{}) {
// 启动 Informer,监听资源变化
go c.deploymentInformer.Run(stopCh)
go c.replicaSetInformer.Run(stopCh)
go c.podInformer.Run(stopCh)
// 等待缓存同步
cache.WaitForCacheSync(stopCh,
c.deploymentInformer.HasSynced,
c.replicaSetInformer.HasSynced,
)
// 启动工作协程
for i := 0; i < workers; i++ {
go wait.Until(c.worker, time.Second, stopCh)
}
}
func (c *DeploymentController) worker() {
for c.processNextWorkItem() {}
}
func (c *DeploymentController) processNextWorkItem() bool {
key, quit := c.queue.Get()
if quit { return false }
defer c.queue.Done(key)
err := c.syncDeployment(key.(string))
if err != nil {
c.queue.AddRateLimited(key) // 失败重试
}
return true
}Deployment 控制器
管理 Deployment → ReplicaSet → Pod 的三层关系:
Deployment
│ 创建/管理
▼
ReplicaSet (当前版本)
│ 创建/管理
▼
Pod × N
滚动更新时:
Deployment
├── ReplicaSet (旧版本,逐渐缩容)
└── ReplicaSet (新版本,逐渐扩容)yaml
# 滚动更新策略
spec:
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1 # 最多多出 1 个 Pod
maxUnavailable: 0 # 最多 0 个不可用Node 控制器
监控节点健康状态,处理节点故障:
节点心跳超时(默认 40s)
│
▼
标记节点 NotReady
│
▼ 等待 pod-eviction-timeout(默认 5min)
▼
驱逐节点上的 Podbash
# 查看节点状态
kubectl get nodes
kubectl describe node node1 | grep -A5 Conditions
# 手动驱逐节点(维护时)
kubectl drain node1 --ignore-daemonsets --delete-emptydir-data
kubectl uncordon node1 # 恢复调度Endpoint 控制器
维护 Service 与 Pod 的映射关系:
Service (selector: app=nginx)
│
▼ EndpointController 监听 Pod 变化
▼
Endpoints (记录所有 Ready Pod 的 IP:Port)
│
▼
kube-proxy 读取 Endpoints,更新 iptables/ipvs 规则GarbageCollection 控制器
通过 OwnerReference 实现级联删除:
yaml
# Pod 的 OwnerReference 指向 ReplicaSet
metadata:
ownerReferences:
- apiVersion: apps/v1
kind: ReplicaSet
name: my-rs-abc123
uid: "xxx"
controller: true
blockOwnerDeletion: true删除 Deployment → 删除 ReplicaSet → 删除 Pod(级联)
领导者选举
Controller Manager 多实例部署时,通过 Lease 对象实现领导者选举,只有 Leader 实例真正运行控制器:
go
// 领导者选举配置
leaderelection.RunOrDie(ctx, leaderelection.LeaderElectionConfig{
Lock: &resourcelock.LeaseLock{
LeaseMeta: metav1.ObjectMeta{
Name: "kube-controller-manager",
Namespace: "kube-system",
},
Client: coordinationClient,
},
LeaseDuration: 15 * time.Second, // 租约时长
RenewDeadline: 10 * time.Second, // 续约截止时间
RetryPeriod: 2 * time.Second, // 重试间隔
Callbacks: leaderelection.LeaderCallbacks{
OnStartedLeading: func(ctx context.Context) {
// 成为 Leader,启动所有控制器
run(ctx)
},
OnStoppedLeading: func() {
// 失去 Leader,退出
os.Exit(0)
},
},
})关键启动参数
bash
kube-controller-manager \
--controllers=*,bootstrapsigner,tokencleaner \
--node-monitor-period=5s \
--node-monitor-grace-period=40s \
--pod-eviction-timeout=5m \
--concurrent-deployment-syncs=5 \
--concurrent-replicaset-syncs=5 \
--concurrent-gc-syncs=20 \
--leader-elect=true监控指标
workqueue_depth # 工作队列深度
workqueue_adds_total # 入队总数
workqueue_queue_duration_seconds # 在队列中等待时长
workqueue_work_duration_seconds # 处理耗时
controller_runtime_reconcile_total # Reconcile 总次数
controller_runtime_reconcile_errors_total # Reconcile 错误次数