CloudPe
Glossary

kube-controller-manager in Kubernetes

CloudPe Team
kube-controller-manager in Kubernetes

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:

ComponentWhat it does
kube-schedulerDecides which node a new pod should run on
kube-controller-managerMakes 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.