Kubernetes Controller Manager 概述

Kubernetes Controller Manager 是 Kubernetes 控制平面的核心组件之一,负责运行各种控制器,确保集群的当前状态与期望状态保持一致。它通过监听 API Server 的资源变化,执行调谐(Reconcile)逻辑,实现自动化管理。


核心功能

集群状态管理
Controller Manager 包含多个内置控制器,如 Deployment Controller、ReplicaSet Controller、Node Controller 等。每个控制器负责特定资源的生命周期管理,确保实际状态匹配用户声明的期望状态。

控制器协作
不同控制器之间通过 API Server 协同工作。例如,Deployment Controller 创建 ReplicaSet,ReplicaSet Controller 进一步创建 Pod,形成层级化的管理。

故障恢复
当节点或 Pod 异常时,相关控制器(如 Node Controller 或 Replication Controller)会检测并触发修复操作,例如重新调度 Pod 或更新节点状态。


主要控制器列表

  1. Deployment Controller
    管理 Deployment 资源,确保指定数量的 Pod 副本运行。支持滚动更新和回滚。

  2. ReplicaSet Controller
    维护 Pod 副本数,与 Deployment 协同工作,但更专注于副本数量的保证。

  3. StatefulSet Controller
    管理有状态应用,提供稳定的网络标识和持久化存储。

  4. DaemonSet Controller
    确保每个节点(或符合条件的节点)运行一个指定的 Pod 副本,常用于日志收集或监控代理。

  5. Job/CronJob Controller
    管理一次性任务(Job)和定时任务(CronJob),确保任务按预期完成。

  6. Node Controller
    监控节点状态,处理节点不可用情况,如标记节点为 NotReady 并触发 Pod 重新调度。

  7. Endpoint Controller
    维护 Service 与 Pod 的映射关系,生成 Endpoints 对象。

  8. Service Account Controller
    为命名空间创建默认 Service Account 并确保其存在。


工作原理

监听机制
Controller Manager 通过 API Server 的 Watch 接口监听资源变更事件(如创建、更新、删除)。当事件触发时,控制器执行调谐逻辑。

调谐循环(Reconcile Loop)
每个控制器运行一个无限循环,比较资源的当前状态与期望状态。若不一致,控制器调用 API Server 进行修正。例如,ReplicaSet Controller 发现实际 Pod 数量少于预期时,会创建新的 Pod。

领导者选举
高可用部署中,多个 Controller Manager 实例通过领导者选举机制确保只有一个活跃实例运行控制器,避免冲突。


配置与优化

启动参数
常用参数包括:

  • --controllers:指定启用的控制器列表(默认为所有控制器)。
  • --leader-elect:是否启用领导者选举(默认为 true)。
  • --cluster-signing-cert-file--cluster-signing-key-file:为证书控制器配置签名密钥。

性能调优

  • 并发设置:通过 --concurrent-* 参数(如 --concurrent-deployment-syncs)控制各控制器的同步并发数。
  • 速率限制:调整 --kube-api-qps--kube-api-burst 限制对 API Server 的请求频率。

常见问题排查

控制器未生效
检查 Controller Manager 日志,确认相关控制器已启动且无错误。例如:

kubectl logs -n kube-system kube-controller-manager-<pod-name>

资源同步延迟
可能因 API Server 负载过高或网络问题导致。优化 --kube-api-qps 或检查集群网络状况。

领导者选举问题
若高可用集群中多个实例持续竞争领导者,检查 --leader-elect-* 相关参数及底层存储(如 etcd)的健康状态。


自定义控制器开发

用户可通过 Kubernetes 的 client-go 库和 controller-runtime 框架开发自定义控制器。关键步骤包括:

  1. 定义 CRD(Custom Resource Definition)。
  2. 实现 Reconcile 逻辑。
  3. 使用 Manager 注册控制器并启动。

示例代码片段:

import (
    "sigs.k8s.io/controller-runtime/pkg/manager"
    "sigs.k8s.io/controller-runtime/pkg/reconcile"
)

func setupController(mgr manager.Manager) error {
    return ctrl.NewControllerManagedBy(mgr).
        For(&myv1.MyResource{}).
        Complete(&MyReconciler{Client: mgr.GetClient()})
}
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐