KubeControllerManagerDown
kube-controller-manager was being scraped before and now no instance of it is up.
| Severity | critical |
| Source | kube-controller-manager /metrics (HTTPS, port 10257) |
| Key metric | up |
What it means
The alert is scoped to clusters where the controller manager has been seen recently, so managed control planes that hide it stay quiet. It fires once all instances have been unreachable for a sustained window.
The controller manager runs the reconciliation loops: ReplicaSets, Deployments, Jobs, node lifecycle, endpoints, service accounts, garbage collection and certificate signing. When it is gone, deleted pods are not replaced, dead nodes are not marked or evicted, and kubelet CSRs stop being approved.
Common causes
- The static pod crashes because of an invalid flag in
/etc/kubernetes/manifests/kube-controller-manager.yaml. - Expired
controller-manager.confclient certificate. - Metrics bound to
127.0.0.1after a kubeadm upgrade, so only the scrape fails. - Control plane node down or under heavy memory pressure.
- Leader election loss loops caused by a very slow API server.
First checks
- Check whether reconciliation still works: scale a test deployment and see if pods appear.
kubectl -n default create deployment kcm-check --image=registry.k8s.io/pause:3.9 kubectl -n default get rs,pods -l app=kcm-check kubectl -n default delete deployment kcm-check - Inspect the pods and logs:
kubectl -n kube-system get pods -l component=kube-controller-manager -o wide kubectl -n kube-system logs -l component=kube-controller-manager --tail=100 - Check the leader lease renew time:
kubectl -n kube-system get lease kube-controller-manager -o jsonpath='{.spec.holderIdentity} {.spec.renewTime}' - On the control plane node:
sudo crictl ps -a --name kube-controller-manager sudo kubeadm certs check-expiration - Check scrape errors in Prometheus Status → Targets.
Fixing it
Revert the broken manifest change or renew certificates with kubeadm certs renew controller-manager.conf. For scrape-only failures, change --bind-address and confirm the ServiceMonitor targets port 10257 over HTTPS. If the API server is slow, fix that first or the leader election will keep failing.
Related alerts
- KubeSchedulerDown: usually shares the root cause.
- KubeAPILatencyHigh: can cause lost leases and restarts.
- KubeletClientCertificateRenewalErrors: kubelet CSRs pile up while it is down.