kube-controller-manager异常时需依次检查pod状态、健康端点、api通信、启动参数、etcd性能及rbac权限:先用kubectl get pods确认是否0/1或createcontainererror;再curl -k https://127.0.0.1:10257/healthz验证本地服务;接着测试api server连通性;然后检查describe中--controllers参数是否启用deployment等关键控制器;再查events中etcd超时错误;最后用kubectl auth can-i验证system:kube-controller-manager权限。

当kube-controller-manager持续无法同步Deployment、Service、Node等资源,导致Pod不被调度、副本数不更新、节点状态不刷新时,必须立即定位其控制循环中断点。
确认controller-manager是否处于运行异常状态
执行 kubectl get pods -n kube-system | grep controller-manager,观察Pod状态是否为 0/1、CreateContainerError 或长期卡在 ContainerCreating;若状态为 Running 但资源不变化,需继续排查。
运行 kubectl get componentstatuses(如启用聚合层),检查 controller-manager 条目是否显示 Unknown 或 Healthy —— 注意:该命令在v1.19+默认禁用,不可作为唯一依据。
直接查看对应Pod日志:kubectl logs -n kube-system kube-controller-manager-<node-name> --tail=100</node-name>,重点搜 error、failed to sync、context deadline exceeded、connection refused 等关键词。
检查controller-manager与API Server通信链路
方法一:登录controller-manager所在节点,执行 curl -k https://127.0.0.1:10257/healthz(默认metrics端口为10257,健康检查路径为/healthz)。返回 ok 表示本地HTTP服务正常;若超时或报 Connection refused,说明进程未监听或端口被占用。
方法二:验证controller-manager是否能连通API Server。在该节点执行:curl -k https://<api-server-ip>:6443/api/v1/namespaces/default --cert /etc/kubernetes/pki/apiserver-kubelet-client.crt --key /etc/kubernetes/pki/apiserver-kubelet-client.key --cacert /etc/kubernetes/pki/ca.crt</api-server-ip>。若返回 Unauthorized 或 Forbidden 属正常;若返回 Connection timed out 或 Unable to connect,则网络或证书配置错误。
【证书路径必须严格匹配kubeadm生成的路径,修改过PKI目录结构会导致controller-manager启动后静默失败】
定位控制循环阻塞根源
第一步:检查controller-manager启动参数是否禁用关键控制器。执行 kubectl describe pod kube-controller-manager-<node-name> -n kube-system | grep -A 5 'Args'</node-name>,确认是否含 --controllers=* 或显式启用了 deployment、node、service 等控制器;若为 --controllers=-* 或只列了少数几个,将直接导致对应资源不被管理。
第二步:查看是否有资源锁竞争或etcd写入瓶颈。执行 kubectl get events -n kube-system --field-selector reason=FailedCreate,reason=UpdateFailed --sort-by=.lastTimestamp | tail -20,若大量出现 etcdserver: request timed out 或 context deadline exceeded,说明etcd响应延迟过高,需检查etcd集群健康状态及磁盘IO。
第三步:确认controller-manager是否因权限不足无法操作资源。运行 kubectl auth can-i list deployments --all-namespaces --as system:kube-controller-manager,预期输出 yes;若为 no,说明RBAC绑定缺失,需检查 system:kube-controller-manager ClusterRoleBinding 是否存在且绑定正确ClusterRole。











