What is kube-controller-manager in Kubernetes?
kube-controller-manager is the control plane component that constantly checks your cluster’s current state against its desired state, and fixes the difference. For example, if you asked for 3 replicas of a pod and one of them crashes, kube-controller-manager notices and creates a replacement.
It doesn’t run as one single controller. It’s a collection of controllers, all compiled into a single process to keep things simple.
What kube-controller-manager actually does
Each controller inside the kube-controller-manager watches for a specific type of change and reacts to it.
Some of the main ones:
- Node controller: Notices when a node goes down and responds accordingly.
- Job controller: Watches for Job objects and creates pods to run them to completion.
- ReplicaSet controller: Makes sure the right number of pod replicas are always running.
- EndpointSlice controller: Keeps the link between Services and Pods up to date.
- ServiceAccount controller: Creates default service accounts for new namespaces.
This isn’t the full list. Kubernetes ships with several more controllers, all managed the same way.
kube-controller-manager vs kube-scheduler
These two are easy to mix up since both run in the control plane and both react to cluster changes:
| Component | What it does |
| kube-scheduler | Decides which node a new pod should run on |
| kube-controller-manager | Makes sure the cluster’s actual state keeps matching what you asked for, ongoing |
The scheduler makes a one-time placement decision. The controller manager keeps watching, indefinitely, and corrects drift whenever it happens.
kube-controller-manager vs cloud controller manager
Kubernetes also has a separate component called the cloud controller manager. It handles the parts of cluster management that are specific to your cloud provider, like provisioning load balancers or attaching storage volumes. kube-controller-manager handles core Kubernetes logic that has nothing to do with any particular cloud. Splitting these apart keeps cloud-specific code out of the core Kubernetes codebase.
Checking kube-controller-manager
Like kube-apiserver and kube-scheduler, it usually runs as a static pod in the kube-system namespace:
Check if it’s running
kubectl get pods -n kube-system | grep kube-controller-manager
View its logs
kubectl logs kube-controller-manager- -n kube-system
Check controller manager metrics (if exposed)
kubectl get --raw /metrics | grep controller_manager
If a resource isn’t behaving as expected, for example, a deleted pod not getting replaced, checking these logs is usually the first step.
Where it fits in the control plane
kube-controller-manager works through kube-apiserver, reading the cluster’s current state and writing corrections back through it, which then get stored in etcd. It doesn’t touch etcd directly, and it doesn’t decide pod placement either; that’s kube-scheduler’s job.
Managed Kubernetes services like run and maintain kube-controller-manager for you as part of the control plane. For implementation details, the kube-controller-manager source is available in the main Kubernetes GitHub repository.