Skip to content

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)

驱逐节点上的 Pod
bash
# 查看节点状态
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 错误次数

本站内容由 褚成志 整理编写,仅供学习参考