What Is the Control Plane in Kubernetes?
A beginner-friendly tour of the brain of every Kubernetes cluster: what its parts are, how they talk, what happens when you ask for a new application, and what to do when things go wrong. Every new word is explained the moment it appears.
Picture a busy airport. Hundreds of planes take off and land every day, yet the people in the control tower never touch a single plane. They watch screens, talk on radios, and decide which plane may use which runway and when. If the tower goes quiet, the planes already in the air keep flying for a while, but nothing new can be safely organised. The tower is not the airport’s muscle. It is the airport’s brain.
Kubernetes has exactly such a tower, and it is called the control plane. Whenever you ask Kubernetes to run an application, scale it up, or replace a broken copy, the control plane is the part that receives your request, remembers it, makes the decisions, and gives the orders. Learning what it is made of is the single best step you can take toward understanding Kubernetes as a whole. This guide explains it slowly, from zero, with everyday comparisons and real examples.
AThe Short Answer: What Is the Control Plane?
If you only remember one paragraph from this article, make it the next one.
The control plane is the group of programs that manages a Kubernetes cluster. It stores the cluster’s records, accepts requests from people and tools, decides where applications should run, and constantly works to make the real state of the cluster match the state you asked for. It does not run your applications itself. Your applications run on other machines called worker nodes, and the control plane simply directs them.
The control plane is the control tower of an airport. Planes are your applications, runways are the machines with free space, and pilots are the small agents on each machine. The tower keeps a live map, hears every request, chooses who goes where, and notices when a plane is missing. Yet the tower itself never carries a passenger.
The five parts in one glance
kube-apiserver
The front door and the only public voice of the cluster. Every request goes through it.
etcd
The memory. A reliable database that stores the entire state of the cluster.
kube-scheduler
The matchmaker that chooses which machine should run each new pod.
kube-controller-manager
A bundle of watchers that keep fixing differences between what you want and what exists.
cloud-controller-manager
An optional part that talks to your cloud provider to create load balancers, disks, and routes.
Why it has this name
The words “control plane” come from computer networking. In a network router, the control plane decides where traffic should go, while the data plane actually moves the traffic. Kubernetes borrowed the idea. The control plane decides and records, and the worker nodes do the real work of running containers. In older Kubernetes articles you will see the control plane machines called master nodes. The community moved away from that word, so today the correct name is control plane node.
Three common misunderstandings
“The control plane runs my containers.” It does not. Containers run on worker nodes, started by the kubelet. The control plane only decides and records.
“If the control plane stops, my website goes offline.” Usually not. Existing containers keep serving visitors. What you lose is the ability to change, heal, or scale anything until the brain returns.
“The control plane is one program.” It is a small team of programs, each with one clear responsibility. This separation is intentional, because small focused programs are easier to secure, scale, and replace than a single giant one.
Control plane means “the part that decides”. Worker nodes mean “the part that does”. When someone says the cluster is down, first ask which of the two is unhealthy, because the symptoms are very different.
BThe Big Picture: Cluster, Nodes, and Where the Control Plane Sits
Before opening the control plane, let us look at the whole building it lives in.
A container is a sealed package holding an application and everything it needs to run. Running one container is easy. Running thousands across many computers is hard, and that is the job of Kubernetes, a system that manages containers at scale. A Kubernetes installation is called a cluster, which means a group of computers cooperating as one. Each computer in the cluster is a node. Nodes come in two kinds: control plane nodes, which host the decision-making programs, and worker nodes, which host your applications inside small wrappers called pods.
flowchart TB
ENG["Engineer using kubectl"] --> LB["Load Balancer in front of API servers"]
CI["CI pipeline and other tools"] --> LB
LB --> API
subgraph CP["Control Plane"]
API["kube-apiserver"]
ETCD["etcd"]
SCH["kube-scheduler"]
KCM["kube-controller-manager"]
CCM["cloud-controller-manager"]
API ETCD
SCH --> API
KCM --> API
CCM --> API
end
subgraph W1["Worker Node 1"]
KL1["kubelet"]
PX1["kube-proxy"]
POD1["Pods running your apps"]
end
subgraph W2["Worker Node 2"]
KL2["kubelet"]
PX2["kube-proxy"]
POD2["Pods running your apps"]
end
KL1 --> API
KL2 --> API
KL1 --> POD1
KL2 --> POD2
CCM --> CLOUD["Cloud Provider API"]
Who does what
| Question | Control plane | Worker node |
|---|---|---|
| Main role | Decides, records, and coordinates | Runs the application containers |
| Typical programs | API server, etcd, scheduler, controller manager | kubelet, kube-proxy, container runtime |
| Runs your applications? | Normally not | Yes |
| Talks to engineers? | Yes, through the API server | No, only through the control plane |
| If it stops | No new changes, no healing, no scaling | Applications on that node stop |
| Usual count | Three or five for safety | From a few to thousands |
Consider a large restaurant chain. Head office keeps the recipes, the staff records, and the plan for opening new branches. Each branch kitchen just cooks and serves. Head office is the control plane. The branch kitchens are the worker nodes, and the branch manager who follows head office instructions is the kubelet.
In small learning setups, such as a laptop cluster, the control plane and the worker share one machine. In serious production clusters, teams keep them apart and normally stop ordinary applications from running on control plane machines, so that a noisy application can never starve the brain.
The two helpers that live on every worker node
Two small programs on each worker node deserve a mention, because they are the control plane’s hands and ears. The kubelet is an agent that introduces the node to the cluster, listens for pods assigned to it, tells the container runtime to start or stop containers, and sends back regular health reports. Without the kubelet, a node is just a silent computer as far as Kubernetes is concerned. The kube-proxy keeps network rules up to date so that traffic sent to a Service name reaches a healthy pod behind it.
Notice how these helpers relate to the control plane: they never make cluster-wide decisions. They obey the records stored by the control plane and report facts back. This one-way habit of “decisions flow down, facts flow up” is a good mental picture for the whole system. It also explains why a worker node can keep running its containers even when it temporarily loses contact with the brain.
CThe Core Idea: Desired State and Control Loops
Every part of the control plane is built on one simple but powerful idea. Once you see it, Kubernetes stops feeling like magic.
Say what you want, not what to do
In Kubernetes you do not give step-by-step orders. Instead you write a description of the situation you want, for example “three copies of my shopping website, each using this package, each allowed this much memory”. This description is called the desired state. The situation that really exists at this moment is called the actual state. The whole job of the control plane is to notice any gap between the two and close it.
The loop that never stops
The tool that closes the gap is the control loop, also called a reconciliation loop. It is a small program that repeats four steps forever.
Observe
Look at the actual state. How many copies of the shopping website are running right now?
Compare
Check the desired state. The record says three, but only two are running, so there is a gap of one.
Act
Take the smallest action that reduces the gap. Ask the system to create one more copy.
Repeat
Go back to step one. If the gap is closed, do nothing. If a new gap appears later, start again.
Think of cruise control in a car. You do not press the pedal yourself. You set the speed you want, and the car keeps measuring its real speed, comparing it with your choice, and adjusting the engine. Going uphill or downhill does not matter, because the loop keeps correcting. Kubernetes is cruise control for applications.
Why this design is so tough
Because the loop compares states rather than reacting to single events, it is very forgiving. Imagine a message saying “a pod died” gets lost in the network. In an event-driven system, that pod would be forgotten forever. In Kubernetes, the next round of the loop simply notices that two pods exist while three are wanted, and it fixes the problem anyway. Engineers call this style level-based rather than edge-based. In plain words: the system trusts the current picture more than the news of changes.
Also notice that there is not one giant controller. There are many small ones, each responsible for one kind of object. One cares about copies of pods, another about nodes, another about batch jobs. Small focused loops are easier to build, test, and fix than one huge brain.
When you delete a pod that belongs to a Deployment, Kubernetes creates a new one within seconds. This is not a bug. It is the control loop doing exactly what it was built to do, because the desired state still says the pod should exist.
Dkube-apiserver: The Front Door of the Cluster
Every single conversation in Kubernetes passes through one program. Understanding it explains most of the system.
The API server, named kube-apiserver, is a web service that exposes the Kubernetes API, which stands for application programming interface, a set of agreed rules for how programs ask each other for things. Engineers reach it using a command-line tool named kubectl. Automated pipelines, dashboards, and even the other control plane parts all use the same door. Nobody is allowed to walk around the back. Not even the scheduler edits the database directly.
The API server is the reception desk of a large bank. Customers, staff, and auditors all go through the desk. The receptionist checks your identity, confirms you have permission for your request, checks the forms are filled properly, and then files the paperwork in the vault. Nobody enters the vault without passing the desk first.
What the API server does
Checks who you are
Authentication uses certificates, tokens, or links to identity systems. Unknown callers are turned away.
Checks what you may do
Authorization, usually RBAC, decides whether this person may create, read, change, or delete this kind of object.
Checks the request itself
Admission rules can adjust or reject requests, for example refusing containers that ask for dangerous powers.
Stores the result
After every check passes, it saves the object in etcd. It is the only part that ever writes there.
Tells others about changes
A feature called watch lets scheduler, controllers, and kubelets subscribe and hear about changes almost instantly.
Keeps a diary
Audit logging can record who asked for what and when, which is precious for security reviews.
Useful facts about the API server
The API server is stateless, meaning it keeps no important data of its own because everything lives in etcd. This makes it easy to run several copies side by side behind a load balancer, which is how production clusters become highly available. It listens on port 6443 by default and always uses encrypted connections. The API is organised into groups and versions, such as the core group for pods and services and the apps group for Deployments, so that Kubernetes can improve features without breaking old tools. The server also offers health addresses named /livez and /readyz so that monitoring tools can ask whether it is alive and ready.
Because everything goes through the API server, a slow or overloaded one makes the whole cluster feel slow. Poorly written tools that ask for huge lists of objects every second are a common cause of trouble. Good controllers use the watch feature instead of asking repeatedly.
Eetcd: The Memory of the Cluster
If the API server is the front door, etcd is the vault behind it. Losing it is the worst thing that can happen to a control plane.
etcd is a small, fast, distributed database that stores data as simple key and value pairs, like a giant labelled filing cabinet. Every object in Kubernetes, including every pod, Deployment, Service, Secret, and setting, is saved there. It first appeared in 2013 at a company called CoreOS and is now a project of the Cloud Native Computing Foundation. Kubernetes uses it as the one and only source of truth. If a fact is not in etcd, then as far as the cluster is concerned, it does not exist.
etcd is the ledger book of a village temple or a town hall. Every decision, every birth, and every land record is written in it. Several trusted clerks keep identical copies, and a new entry only counts once most of the clerks have written it down. If one clerk loses their copy, the others still hold the truth.
How etcd keeps everyone in agreement
Production clusters run several etcd copies, called members, on different machines so that one failure does not lose data. But copies can disagree, so etcd uses a voting method called Raft. In Raft, the members elect one leader. All changes go to the leader, who sends them to the others. A change is officially saved only when a majority, also called a quorum, confirms it. The formula for a majority is half the members plus one.
| Members | Majority needed | Failures survived | Comment |
|---|---|---|---|
| 1 | 1 | 0 | Fine for learning, dangerous for real work |
| 2 | 2 | 0 | Worse than one, since either failure stops the cluster |
| 3 | 2 | 1 | The common production choice |
| 4 | 3 | 1 | No better than three, so it wastes a machine |
| 5 | 3 | 2 | Used for very high safety needs |
This table explains why the number of members is almost always odd. Adding a fourth member does not let you survive more failures than three, yet it makes the vote slower and costs more.
What etcd needs to stay healthy
Fast disks
Every write is flushed to disk before it is confirmed, so slow disks make the entire cluster sluggish. Solid-state storage is strongly recommended.
Small data
etcd has a default storage limit of about 2 gigabytes, with about 8 gigabytes suggested as a practical top. It is meant for records, not for large files.
Regular snapshots
A snapshot is a complete copy of the data. Taking and testing snapshots is the last line of defence against disaster.
Compaction and defragmentation
Old versions of records pile up over time. Periodic cleanup keeps the database lean and fast.
etcd holds every Secret in the cluster. Anyone who can read it directly can read those secrets. Only the API server should be allowed to talk to etcd, using mutual certificates, and the machines running it should be locked down like a bank vault.
Backup and restore in plain words
A snapshot is a frozen copy of everything in etcd at one moment. Taking one is quick and does not stop the cluster. Good teams take snapshots on a schedule, for example every hour, and copy them to a safe place outside the cluster, such as a storage bucket in a different region. Old snapshots are kept for a few days, so that even a mistake noticed late can be undone.
To restore, the team stops the control plane, loads the chosen snapshot into a fresh etcd, and starts the control plane again. The cluster then wakes up believing it is back at the moment of the snapshot. Any change made afterwards, such as a Deployment created ten minutes later, will be missing, so the team must re-apply it. Worker nodes and running containers are not stored in etcd, so they are simply reconciled against the restored records. Because restoring is stressful, engineers write a step-by-step checklist called a runbook and practise it before disaster ever strikes.
Fkube-scheduler: The Matchmaker
When a new pod is born, it has no home. The scheduler finds one.
When you create a pod through a Deployment, the record saved in etcd has an empty field for the node name. The scheduler watches for exactly such homeless pods. For each one, it works out which worker node is the best place to run it, and then writes that choice back through the API server. This decision is called binding. The scheduler does not start anything. It only decides. The kubelet on the chosen node then does the real work.
Think of a hostel warden who assigns rooms to new students. The warden looks at which rooms have free beds, respects special requests such as a ground-floor room, avoids putting rival groups together, and prefers to spread students evenly so no floor is crowded. The student then walks to the room by themselves. The warden never carries the luggage.
Two phases: filter, then score
Filtering
The scheduler removes every node that cannot run the pod. Maybe the node has too little free memory, carries a label the pod does not accept, or is marked unschedulable for maintenance. Only suitable nodes survive.
Scoring
Each surviving node gets points from several rules, such as how much free room it has, whether the container image is already downloaded there, and whether it helps spread copies across zones. The highest score wins.
Binding
The scheduler writes the winner into the pod record. If two nodes tie, it picks one at random.
What influences the decision
Requests
Each pod states how much processor and memory it needs. The scheduler only picks nodes with that much unreserved space.
Node selectors and affinity
Pods can insist on, or prefer, nodes with certain labels, for example machines that have a graphics card.
Taints and tolerations
A node can carry a taint that repels pods. Only pods with the matching toleration may land there. This keeps ordinary apps off special machines.
Anti-affinity and topology spread
Rules that keep copies of the same app on different nodes or different zones, so one failure cannot take them all.
If no node passes the filter, the pod stays in the Pending state and the scheduler keeps trying as the cluster changes. Kubernetes can also use priority classes. A high-priority pod that cannot fit may cause the scheduler to evict lower-priority pods to make room, which is called preemption.
A pod stuck in Pending is usually a scheduling story. Ask for the pod’s events and you will normally see a plain sentence such as “insufficient memory” or “no node matches the required label”. The scheduler tells you why it failed.
A worked example
Suppose your cluster has three worker nodes. Node one has plenty of free memory but sits in Zone A alongside two other copies of your shopping app. Node two has less free memory but sits in Zone B and runs no copy of the app. Node three is in Zone C with good free memory, but carries a taint reserved for machine learning jobs, and your pod has no matching toleration.
The scheduler first filters. Node three is removed at once because of the taint. Nodes one and two both have room, so both survive. Next comes scoring. Node one earns points for free memory, but loses points because putting a fourth copy in Zone A would leave the app poorly spread. Node two earns points for spreading across zones. The spread rule counts heavily, so node two wins and the pod is bound there. Because the decision follows clear rules, an engineer can always reconstruct why the scheduler chose as it did.
Real clusters are built with a flexible scheduling framework in which each rule is a plug-in. Companies with unusual needs, like batch computing or graphics processor sharing, replace or add plug-ins, or run a second custom scheduler alongside the default one. Pods choose which scheduler they trust by naming it in their description.
GThe Controller Managers: The Tireless Watchers
The control loops from Chapter C live here. This is where the real work of keeping the cluster tidy happens.
The kube-controller-manager is one program that bundles dozens of separate control loops, each called a controller. Packing them into one program simply makes them easier to deploy. Each controller watches one kind of object through the API server and reacts to gaps between desired and actual state.
Some controllers you should know
| Controller | What it watches | What it does |
|---|---|---|
| Deployment controller | Deployments | Creates and updates ReplicaSets to perform rolling updates and rollbacks |
| ReplicaSet controller | ReplicaSets and pods | Creates or deletes pods until the right number exist |
| Node controller | Node heartbeats | Notices silent nodes and marks them unhealthy |
| Job controller | Jobs | Runs pods until the task completes successfully |
| EndpointSlice controller | Services and pods | Keeps the list of healthy addresses behind each Service |
| ServiceAccount controller | Namespaces | Creates the default identity that pods use |
| Namespace controller | Deleted namespaces | Cleans everything up inside a removed namespace |
A closer look at the node controller
Every kubelet sends a heartbeat to the control plane regularly. If the node controller stops hearing from a node for about 40 seconds, which is the default grace period, it marks that node as unknown. Kubernetes then adds a taint to the node. By default, pods tolerate that taint for another five minutes before they are evicted, and only then does the ReplicaSet controller notice missing pods and create replacements elsewhere. These waiting times protect you from panic over a short network hiccup, and you can tune them for faster recovery.
A school has many class monitors. One counts desks, one checks attendance, one watches the water tank, and one makes sure homework is collected. None of them does the teacher’s job, and none of them waits to be told the room is untidy. Each simply keeps checking its own small area and fixing what is out of place. Controllers are those monitors.
The cloud-controller-manager
When Kubernetes runs on a cloud such as Amazon Web Services, Google Cloud, or Microsoft Azure, some tasks need the cloud’s own tools. The cloud-controller-manager holds the cloud-specific controllers, so the main code stays neutral. Its node controller asks the cloud whether a machine that went silent has been deleted. Its service controller creates a real cloud load balancer when you ask for a Service of type LoadBalancer. Its route controller sets up network routes between nodes. On a laptop cluster or a bare-metal data centre, this component may not exist at all.
Production clusters run several copies of the scheduler and controller managers, one on each control plane node, for safety. Yet if two controllers acted at once, they might both create the missing pod and produce duplicates. To prevent this, the copies hold an election through a shared record called a Lease. Only the winner, the leader, works. The others wait and take over within seconds if the leader disappears.
HData Flow and Lifecycle: One Request from Start to Finish
Now we connect all the parts. Let us follow a single request, “run three copies of my web app”, through the control plane.
sequenceDiagram
participant E as Engineer with kubectl
participant A as kube-apiserver
participant D as etcd
participant C as Controller Manager
participant S as kube-scheduler
participant K as kubelet on chosen node
E->>A: Create Deployment with 3 replicas
A->>A: Authenticate, authorize, run admission checks
A->>D: Save Deployment
A-->>E: Created
C->>A: Watch sees new Deployment
C->>A: Create ReplicaSet
C->>A: Create 3 Pods with no node yet
S->>A: Watch sees Pods without a node
S->>A: Bind each Pod to a chosen node
K->>A: Watch sees Pod assigned to me
K->>K: Pull image and start containers
K->>A: Report Pod status Running
A->>D: Save updated status
Step by step in plain words
You submit the wish
kubectl sends the Deployment description to the API server over an encrypted connection.
The front door checks it
The API server verifies your identity, checks your permissions, applies admission rules, and validates the shape of the request.
The memory saves it
The API server writes the object into etcd and answers you that it was created. Nothing is running yet. Only the wish is recorded.
Controllers create the pieces
The Deployment controller notices the new object and creates a ReplicaSet. The ReplicaSet controller then creates three pod records.
The scheduler assigns homes
It sees pods with no node, filters and scores nodes, and binds each pod to a winner.
Kubelets do the work
Each chosen node’s kubelet sees a pod assigned to it, downloads the image, starts the containers, and reports the status back.
Inside the API server: the request pipeline
Every request to the API server passes through the same series of gates, like passengers at an airport moving through ticket check, security, and passport control. The order matters, and a failure at any gate stops the request.
flowchart LR
R["Incoming request"] --> AU["Authentication: who are you?"]
AU --> AZ["Authorization: are you allowed?"]
AZ --> MA["Mutating admission: adjust the object"]
MA --> VS["Schema validation"]
VS --> VA["Validating admission: final policy check"]
VA --> ST["Persist in etcd"]
ST --> RS["Response and watch notifications"]
AU -.->|"Fails"| X["Rejected with an error"]
AZ -.->|"Fails"| X
VA -.->|"Fails"| X
Admission controllers deserve a special mention. Mutating admission can change a request, for example by adding a default setting or a helper container. Validating admission can only accept or reject it, and it is where policies such as “no container may run as root” are enforced.
The other direction: what happens when something is deleted or breaks
The same loops handle unhappy events. Suppose a worker node loses power. Its kubelet stops sending heartbeats. After the grace period of about 40 seconds, the node controller marks the node unknown and adds a taint. After a further wait, the pods on that node are marked for eviction. The ReplicaSet controller now sees fewer pods than wanted and creates new pod records. The scheduler places them on healthy nodes, and their kubelets start the containers. No human touched anything, and the desired state of three copies is restored.
Deleting works in a similar polite way. When you delete a pod, the API server first marks it as terminating and gives it a grace period, thirty seconds by default. The kubelet sends the containers a gentle stop signal so they can finish current requests and close connections. Only if they refuse to leave in time are they forced to stop. Finally the pod record is removed from etcd. This graceful goodbye is why well-written applications lose no customer requests during updates.
The scheduler never calls the kubelet, and the controllers never call the scheduler. Each simply watches the shared records and does its own piece. This loose coupling means any single part can crash and restart without confusing the others, because the state is safely kept in etcd.
IInternal Working: Watches, Caches, and Leader Election
How can dozens of programs stay in sync without constantly shouting at each other? The answer is a few clever tricks inside the API machinery.
Watch instead of ask
Imagine a hundred controllers each asking “has anything changed?” every second. The API server would drown. So Kubernetes offers a watch: a program opens one long-lived connection and says “tell me whenever pods change”. The API server then streams each change as it happens. Under the hood, etcd itself supports watching, and the API server passes those events along after its own checks.
A watch is like subscribing to a newspaper instead of walking to the shop every hour to see whether a new issue has appeared. The paper arrives at your door when something is published, and the shopkeeper is spared a thousand pointless visits.
Versions and local caches
Every object carries a counter called the resource version, which increases whenever the object changes. Controllers use it to say “start telling me about changes after version 4,502”. If a controller was disconnected for a moment, it can catch up from where it left off rather than starting from scratch. Most controllers also keep a local copy of the objects they care about, called a cache, kept fresh by a helper called an informer. Reading from the cache is instant and puts no burden on the API server. Work items are placed in a work queue, so a controller handles them one by one, retries failures, and slows down when errors repeat.
Preventing two writers from clashing
What if two people edit the same object at the same time? Kubernetes uses optimistic concurrency. Each update must include the resource version it was based on. If the object has changed since, the API server rejects the update with a conflict message, and the caller reads the fresh copy and tries again. No locks are needed, and nobody silently overwrites someone else’s work.
Watch
One streaming connection replaces endless polling.
Resource version
A counter that lets programs resume exactly where they stopped and detect conflicts.
Informer and cache
Local copies make reads fast and protect the API server.
Work queue
Orders tasks, retries failures, and avoids doing the same job twice at once.
Lease-based election
Ensures only one scheduler and one controller manager act at a time.
Optimistic concurrency
Rejects out-of-date edits instead of locking the record.
Kubernetes scales to very large clusters, officially up to 5,000 nodes and 150,000 pods, largely because of these ideas. Cheap reads from caches, streamed changes, and small independent loops let thousands of components cooperate without a central bottleneck.
JHigh Availability and Failure Scenarios
A brain that can fail is a risky brain. Production clusters therefore run more than one copy of everything.
The shape of a highly available control plane
A production control plane usually has three control plane nodes, sometimes five. Each runs its own API server, scheduler, and controller manager. A load balancer sits in front of the API servers and sends each request to a healthy one. Because the API server is stateless, all copies are equally active. Scheduler and controller manager copies are running too, but only the elected leader of each does work at any moment.
flowchart TB
USERS["kubectl, CI tools, and worker node kubelets"] --> LB["Load Balancer virtual address"]
subgraph CPN1["Control Plane Node 1 in Zone A"]
A1["kube-apiserver"]
S1["scheduler standby"]
M1["controller manager LEADER"]
E1["etcd member"]
end
subgraph CPN2["Control Plane Node 2 in Zone B"]
A2["kube-apiserver"]
S2["scheduler LEADER"]
M2["controller manager standby"]
E2["etcd member"]
end
subgraph CPN3["Control Plane Node 3 in Zone C"]
A3["kube-apiserver"]
S3["scheduler standby"]
M3["controller manager standby"]
E3["etcd member"]
end
LB --> A1
LB --> A2
LB --> A3
A1 --> E1
A2 --> E2
A3 --> E3
E1 E2
E2 E3
E1 E3
Stacked versus external etcd
Stacked etcd (on control plane nodes)
- Fewer machines to buy and look after
- Simple to set up with common tools
- Losing a node loses both a control plane copy and an etcd member at once
- Busy API servers can compete with etcd for resources
External etcd (own machines)
- etcd can be tuned and protected separately
- Failures of the two layers are independent
- More machines and more moving parts
- Extra setup and certificate handling
What happens when the control plane fails?
This is one of the most surprising facts for beginners: your running applications usually keep running. The kubelet on each worker node already knows which pods it should run, and the containers themselves do not need the control plane to serve visitors. Network rules already programmed on the nodes also keep working. But everything that needs a decision stops.
| Failure | What still works | What breaks |
|---|---|---|
| Whole control plane down | Existing pods keep serving users | No kubectl, no new pods, no scaling, no healing, no rollouts |
| One API server down (HA) | Everything, through the other copies | Nothing, as long as the load balancer notices |
| Scheduler down | Running pods, and controllers still create pod records | New pods stay Pending with no home |
| Controller manager down | Running pods and scheduling | Crashed pods are not replaced, and rollouts stall |
| etcd loses its majority | Running pods keep going | The API becomes read-only or unavailable, so no changes are possible |
| etcd data corrupted, no backup | Running pods, for a while | The cluster forgets what it should run, and recovery may be impossible |
If the control tower loses power, planes already in the sky do not fall. Pilots can keep flying on the last instructions for a while. But no new takeoff can be cleared, no problem can be handled, and each minute of silence raises the risk. The longer the outage, the worse things become, which is why towers have backup generators and backup controllers.
Backing up etcd is not enough. Teams must practise restoring from a snapshot in a test environment. A backup that has never been restored is only a hope, not a plan.
KSecuring the Control Plane
Whoever controls the control plane controls every application in the cluster. Protecting it is the first duty of any platform team.
The control plane is like the master key room of a huge hotel. If a thief reaches it, every guest room is open. So the room has a strong door, a guard, a log of who enters, and a rule that only a few trusted staff hold keys. Security here is built in layers, not from a single lock.
Key protections
Encryption everywhere
All connections between control plane parts, and between them and the nodes, use TLS with certificates. Plain unencrypted traffic should never exist.
Strong authentication
Turn off anonymous access, avoid shared passwords, and prefer short-lived tokens or a company single sign-on system.
Least-privilege RBAC
Grant each person and program only the exact actions it needs. Avoid handing out the all-powerful cluster-admin role.
Admission controls
Use built-in Pod Security admission and policy engines to reject risky workloads before they are ever saved.
Encryption at rest
By default, Secrets in etcd are only encoded, not encrypted. Turn on encryption at rest, or keep real secrets in an external vault.
Audit logs
Record who did what and when. When something odd happens, these logs are the first place investigators look.
Network exposure and certificates
Permissions deserve a closer look. RBAC works with four simple ideas. A role lists actions, such as “read pods in the shop area”. A binding attaches that role to a person, a group, or a program. A service account is the identity a program running inside a pod uses when it calls the API server. Every action is checked against these rules, and anything not allowed is refused by default. Good teams start with narrow roles, for example “can read pods but not secrets”, and review the list of powerful roles regularly.
The API server should be reachable only from trusted networks. Many teams place it on a private address and reach it through a secure tunnel or a bastion machine. The etcd port must never be open to the wider network. Certificates also expire. On clusters created with the common kubeadm tool, the certificates are valid for one year by default and are renewed when you upgrade. An unnoticed expiry can suddenly stop the cluster from talking to itself, so put a reminder in the calendar or use automation.
A cautionary tale
In 2018 security researchers discovered that a Kubernetes administration console belonging to Tesla was open to the internet with no password. Attackers had used that door to run hidden cryptocurrency mining inside the company’s cloud account. The lesson is simple: management doors must never face the public internet without strong authentication, because they lead straight to the control plane.
Kubernetes releases roughly three minor versions a year, and each is supported for about a year. Running an old, unsupported control plane means known security holes stay open. Plan regular upgrades, one minor version at a time.
LMonitoring, Logging, and Metrics
You cannot fix what you cannot see. The control plane politely publishes plenty of information about its own health.
A hospital keeps a monitor beside every patient showing heart rate, breathing, and blood pressure. Nurses do not wait for the patient to complain. They watch the numbers and act when a trend looks wrong. The control plane deserves the same attention because it is the patient on whom every other patient depends.
Where the information comes from
Each control plane program exposes a /metrics address in a format that Prometheus, the popular monitoring system, can collect. The API server also has health addresses named /livez and /readyz. Programs write logs to standard output, and on control plane nodes these are collected by a log agent and shipped to a central store. In managed services, the provider often lets you switch on control plane logs, delivered to a service such as Amazon CloudWatch.
The numbers worth watching
| Component | What to watch | Why it matters |
|---|---|---|
| API server | Request rate, error rate, and request duration | Slow or failing requests slow every user and every controller |
| API server | Requests rejected for being too many | Signals a noisy client or a runaway tool |
| etcd | Disk sync duration | Slow disks make the entire cluster slow |
| etcd | Leader changes and database size | Frequent elections show instability, and a full database blocks writes |
| Scheduler | Pending pods and scheduling latency | Growing queues mean pods cannot find homes |
| Controller manager | Work queue depth and retries | A deep queue means the controllers are falling behind |
| Certificates | Days until expiry | Expired certificates can silently break the cluster |
flowchart LR
API["kube-apiserver metrics and audit log"] --> PR["Prometheus"]
ETCD["etcd metrics"] --> PR
SCH["scheduler metrics"] --> PR
KCM["controller manager metrics"] --> PR
API --> LA["Log agent on control plane node"]
ETCD --> LA
LA --> LS["Central log store"]
PR --> GF["Grafana dashboards"]
PR --> AM["Alertmanager"]
AM --> OC["On-call engineer"]
LS --> INV["Investigation and audit review"]
A helpful starting rule comes from the four golden signals in Google’s well-known reliability book: latency (how long requests take), traffic (how many arrive), errors (how many fail), and saturation (how full the resources are). Apply them to the API server first, then add etcd disk speed, and you already cover most early warnings.
Set alerts for slow etcd disk syncs and rising API errors before users complain. A control plane usually gets slow before it fails, so trends give you precious time to act.
MExtending the Control Plane: Design Patterns and Anti-Patterns
The control plane is not a closed box. Its greatest strength is that you can teach it new tricks using the same rules it uses for itself.
Custom resources and operators
Kubernetes ships with objects such as pods and Deployments. But suppose your company runs a database and wishes it could say “give me a database with three replicas and a daily backup” and have the cluster handle everything. You can add a brand-new kind of object by registering a CustomResourceDefinition, usually shortened to CRD. The API server immediately learns to accept, check, and store that new object type, exactly as it does for built-in ones.
A CRD alone is only a form to fill in. To make something happen, you write a custom controller that watches those objects and runs a control loop, just like the built-in controllers. A custom controller that carries the knowledge of a human expert, such as a database administrator, is called an operator. The idea was introduced by CoreOS in 2016, and today many tools, including cert-manager for certificates and Prometheus Operator for monitoring, work this way.
A CRD is a new printed form added to the bank’s counter, for example a “gold loan application”. An operator is a trained clerk assigned to that form, who reads each application and carries out every step until the customer is served. The bank building stays the same, yet it now offers a brand-new service.
Other useful patterns
Declarative configuration
Describe the final state in files and apply them, instead of typing one-off commands. Files can be reviewed, versioned, and repeated.
GitOps
Keep those files in a Git repository, and let a tool such as Argo CD or Flux apply every approved change to the cluster automatically.
Admission policy as code
Write company rules once, such as required labels or banned settings, and let admission webhooks enforce them on every request.
Separate clusters by purpose
Keep production apart from testing so that a mistake in one cannot bring down the other’s control plane.
Anti-patterns to avoid
What it is
Running heavy application workloads on the control plane nodes to save money.
Why it hurts
A busy or misbehaving application can starve the API server or etcd of memory and disk speed, and then the whole cluster slows or fails.
Better approach
Keep control plane nodes dedicated. Add worker nodes for applications and let the default taint keep ordinary pods away.
What it is
Using etcd or Kubernetes objects as a general storage place for large files or fast-changing application data.
Why it hurts
etcd is built for small, important records. Large or constantly changing data fills its limit, slows every write, and can block the entire cluster.
Better approach
Store big data in object storage or a proper database, and keep only small references in Kubernetes.
What it is
Tools or scripts that ask the API server for full lists of objects again and again, several times a second.
Why it hurts
Each list request forces the API server and etcd to do heavy work. A handful of careless clients can slow down the entire cluster for everybody.
Better approach
Use watches and informers, request only the objects you need with label filters, and set sensible client limits.
What it is
A single control plane node and no etcd backups for a cluster that serves real customers.
Why it hurts
One hardware failure or one disk mistake removes the brain and its memory together, and rebuilding from nothing takes hours or days.
Better approach
Run three control plane nodes across zones, schedule etcd snapshots, and rehearse restoring them.
NBest Practices and Common Mistakes
These habits come from real outages and long nights. Copy them early and you will skip the worst of the pain.
Habits that keep a control plane healthy
Run three or five control plane nodes
Spread them across separate zones so a data-centre problem cannot remove the majority.
Give etcd fast, dedicated disks
Solid-state drives keep write delays small. Slow etcd is the top cause of a sluggish control plane.
Back up and rehearse
Take regular etcd snapshots, store them away from the cluster, and test a full restore a few times a year.
Limit what clients can do
Use API priority and fairness, which is built in, together with client-side limits, so no single tool can flood the API server.
Upgrade on a steady rhythm
Move one minor version at a time, control plane first and worker nodes afterwards, and read the release notes for removed features.
Watch and alert
Track API latency, etcd health, pending pods, and certificate expiry with alerts that reach a person.
Common mistakes and their fixes
| Mistake | What happens | Fix |
|---|---|---|
| Even number of etcd members | Extra cost without extra safety, and possible ties in elections | Use three or five members |
| Ignoring certificate expiry | Components suddenly refuse to talk to each other | Monitor expiry dates and renew automatically |
| Etcd on slow or shared disks | Frequent leader elections and slow API responses | Use fast dedicated storage |
| Too many objects piling up | Old jobs, events, and unused resources bloat the database | Set clean-up rules and expiry times |
| Exposing the API server publicly | Attackers can scan and attack the door to your cluster | Limit access to trusted networks and require strong authentication |
| Skipping several versions at once | Large, risky upgrades that break removed features | Upgrade one minor version at a time |
| No backup testing | A restore fails at the worst moment | Practise restores on a schedule |
If you are new, start by reading the events and logs of a pod that will not start. Trace which control plane part is involved, whether it is scheduling, image pulling, or permission checking. Every real problem you follow this way makes the architecture stick in your memory.
OManaged vs Self-Managed, and Real-World Examples
You do not have to build and run this brain yourself. Many teams rent it.
Two ways to get a control plane
Managed by a provider
- Provider runs, patches, and scales the API server and etcd
- High availability across zones is built in
- Upgrades are simpler and less risky
- You can focus on applications instead of the brain
Self-managed (for example with kubeadm)
- Full freedom over versions, flags, and hardware
- Works in your own data centre with no cloud
- You handle backups, certificates, and upgrades
- Needs experienced engineers on call
The three big managed services are Amazon EKS, Google Kubernetes Engine, and Azure Kubernetes Service. In each, the provider hides the control plane nodes from you. You see only the API address and your worker nodes. Amazon says EKS runs the control plane across multiple availability zones, and Google’s regional clusters likewise replicate the control plane across zones. In exchange, you lose direct access to etcd and to some control plane settings, and you usually pay a small hourly fee per cluster.
Stories from the real world
Google Borg: the ancestor
Kubernetes grew from Google’s internal Borg system. In Borg, the central brain, called the Borgmaster, was replicated five times so that no single failure could stop it. The same thinking, a small group of replicated coordinators with a reliable store, survives in today’s control plane.
OpenAI: pushing the limits
OpenAI has publicly described running a Kubernetes cluster of about 7,500 nodes for machine learning research. At that size, careful tuning of the API server and etcd became essential, which shows that the control plane is usually the first place large clusters feel pressure.
A start-up on managed Kubernetes
A ten-person team running a mobile app backend chooses Amazon EKS. They never think about etcd disks or certificates, and their engineers spend the time saved on features. This is the most common and sensible pattern for growing companies.
A bank running its own data centre
Rules may require that customer data never leaves the bank’s buildings. The bank runs its own control plane on three dedicated servers per site, with external etcd, private networks, encrypted secrets, and a full-time platform team. Safety and control justify the extra effort.
A learner on a laptop
Tools such as kind and minikube start a full control plane inside a container or a small virtual machine. It is perfect for practice, even though it is not built for real traffic.
How big should a control plane be?
Size depends on how many nodes, pods, and objects the cluster holds, and on how busy the clients are. A small cluster of a few dozen nodes runs happily on three modest control plane machines. As the number of nodes and objects grows into the thousands, the API server needs more memory and processor time, and etcd needs faster disks and more memory to keep its data cached. Watching the metrics from Chapter L is the reliable way to know when to grow, rather than guessing in advance.
It also helps to remember that the count of objects matters as much as the count of machines. A cluster with a few nodes but hundreds of thousands of stored records, from leftover jobs or too many custom resources, can strain etcd more than a large cluster with tidy records. Regular clean-up is a cheap way to delay costly upgrades of the control plane hardware.
Unless you have strict rules about where your data lives or a strong reason to run your own, choose a managed control plane. Running the brain yourself is a full-time responsibility.
PFrequently Asked Questions
Short, plain answers to the questions beginners ask most.
QSummary and Key Takeaways
Back to the airport tower for one last look.
The control plane is the tower of a Kubernetes airport. It takes requests at the front desk, records every decision in a reliable ledger, matches each new pod to a suitable machine, and runs a crowd of small watchers that never stop comparing what you wanted with what exists. It does not carry passengers, but nothing moves in an organised way without it. Understand these five parts and the simple loop that binds them, and the rest of Kubernetes becomes far easier to learn.
Key Takeaways
- The brain of the cluster: The control plane decides, records, and coordinates, while worker nodes run your applications.
- Five parts: The API server is the only door, etcd is the memory, the scheduler picks nodes, the controller manager closes gaps, and the cloud-controller-manager links to the cloud.
- Desired state: You describe what you want, and endless control loops keep reality matching your wish, even if messages are lost.
- Loose coupling: The parts never command each other. They watch and update shared records through the API server, which makes the system resilient.
- Availability: Run three or five control plane nodes across zones, and back up etcd, because running pods survive a control plane outage but nothing new can be changed.
- Security and visibility: Encrypt traffic, restrict access, enable audit logs, protect etcd, and monitor API latency, etcd disk speed, and certificate expiry.
- Choose wisely: Most teams should use a managed control plane such as Amazon EKS, and run their own only when rules or scale demand it.