What Is the Control Plane in Kubernetes?

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.

Analogy

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

Part 1

kube-apiserver

The front door and the only public voice of the cluster. Every request goes through it.

Part 2

etcd

The memory. A reliable database that stores the entire state of the cluster.

Part 3

kube-scheduler

The matchmaker that chooses which machine should run each new pod.

Part 4

kube-controller-manager

A bundle of watchers that keep fixing differences between what you want and what exists.

Part 5

cloud-controller-manager

An optional part that talks to your cloud provider to create load balancers, disks, and routes.

5
Core programs make up the control plane
1
Only the API server is allowed to talk to etcd
3
Control plane machines are the usual minimum for high availability

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.

i
Remember this

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"]
Figure 1. The control plane sits in the middle. Tools reach it through a load balancer, and every worker node reports to it.

Who does what

QuestionControl planeWorker node
Main roleDecides, records, and coordinatesRuns the application containers
Typical programsAPI server, etcd, scheduler, controller managerkubelet, kube-proxy, container runtime
Runs your applications?Normally notYes
Talks to engineers?Yes, through the API serverNo, only through the control plane
If it stopsNo new changes, no healing, no scalingApplications on that node stop
Usual countThree or five for safetyFrom a few to thousands
Analogy

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.

i
Good to know

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.

1

Observe

Look at the actual state. How many copies of the shopping website are running right now?

2

Compare

Check the desired state. The record says three, but only two are running, so there is a gap of one.

3

Act

Take the smallest action that reduces the gap. Ask the system to create one more copy.

4

Repeat

Go back to step one. If the gap is closed, do nothing. If a new gap appears later, start again.

Analogy

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.

i
Practical meaning

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.

Analogy

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

Job 1

Checks who you are

Authentication uses certificates, tokens, or links to identity systems. Unknown callers are turned away.

Job 2

Checks what you may do

Authorization, usually RBAC, decides whether this person may create, read, change, or delete this kind of object.

Job 3

Checks the request itself

Admission rules can adjust or reject requests, for example refusing containers that ask for dangerous powers.

Job 4

Stores the result

After every check passes, it saves the object in etcd. It is the only part that ever writes there.

Job 5

Tells others about changes

A feature called watch lets scheduler, controllers, and kubelets subscribe and hear about changes almost instantly.

Job 6

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.

!
Single point of contact

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.

Analogy

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.

MembersMajority neededFailures survivedComment
110Fine for learning, dangerous for real work
220Worse than one, since either failure stops the cluster
321The common production choice
431No better than three, so it wastes a machine
532Used 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

Speed

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.

Size

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.

Safety

Regular snapshots

A snapshot is a complete copy of the data. Taking and testing snapshots is the last line of defence against disaster.

Care

Compaction and defragmentation

Old versions of records pile up over time. Periodic cleanup keeps the database lean and fast.

!
Guard it closely

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.

Analogy

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

1

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.

2

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.

3

Binding

The scheduler writes the winner into the pod record. If two nodes tie, it picks one at random.

What influences the decision

Resources

Requests

Each pod states how much processor and memory it needs. The scheduler only picks nodes with that much unreserved space.

Labels

Node selectors and affinity

Pods can insist on, or prefer, nodes with certain labels, for example machines that have a graphics card.

Repulsion

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.

Spreading

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.

i
Debugging hint

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

ControllerWhat it watchesWhat it does
Deployment controllerDeploymentsCreates and updates ReplicaSets to perform rolling updates and rollbacks
ReplicaSet controllerReplicaSets and podsCreates or deletes pods until the right number exist
Node controllerNode heartbeatsNotices silent nodes and marks them unhealthy
Job controllerJobsRuns pods until the task completes successfully
EndpointSlice controllerServices and podsKeeps the list of healthy addresses behind each Service
ServiceAccount controllerNamespacesCreates the default identity that pods use
Namespace controllerDeleted namespacesCleans 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.

Analogy

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.

i
Only one is in charge

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
Figure 2. The parts never command each other directly. They read and write shared records through the API server.

Step by step in plain words

1

You submit the wish

kubectl sends the Deployment description to the API server over an encrypted connection.

2

The front door checks it

The API server verifies your identity, checks your permissions, applies admission rules, and validates the shape of the request.

3

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.

4

Controllers create the pieces

The Deployment controller notices the new object and creates a ReplicaSet. The ReplicaSet controller then creates three pod records.

5

The scheduler assigns homes

It sees pods with no node, filters and scores nodes, and binds each pod to a winner.

6

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
Figure 3. The gates every write request must pass before it is saved.

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.

i
Notice the pattern

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.

Analogy

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.

Trick 1

Watch

One streaming connection replaces endless polling.

Trick 2

Resource version

A counter that lets programs resume exactly where they stopped and detect conflicts.

Trick 3

Informer and cache

Local copies make reads fast and protect the API server.

Trick 4

Work queue

Orders tasks, retries failures, and avoids doing the same job twice at once.

Trick 5

Lease-based election

Ensures only one scheduler and one controller manager act at a time.

Trick 6

Optimistic concurrency

Rejects out-of-date edits instead of locking the record.

i
Design lesson

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
Figure 4. A three-node control plane spread over three zones. Any one node or zone can fail and the cluster keeps making decisions.

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.

FailureWhat still worksWhat breaks
Whole control plane downExisting pods keep serving usersNo kubectl, no new pods, no scaling, no healing, no rollouts
One API server down (HA)Everything, through the other copiesNothing, as long as the load balancer notices
Scheduler downRunning pods, and controllers still create pod recordsNew pods stay Pending with no home
Controller manager downRunning pods and schedulingCrashed pods are not replaced, and rollouts stall
etcd loses its majorityRunning pods keep goingThe API becomes read-only or unavailable, so no changes are possible
etcd data corrupted, no backupRunning pods, for a whileThe cluster forgets what it should run, and recovery may be impossible
Analogy

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.

!
Practice recovery

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.

Analogy

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

Traffic

Encryption everywhere

All connections between control plane parts, and between them and the nodes, use TLS with certificates. Plain unencrypted traffic should never exist.

Identity

Strong authentication

Turn off anonymous access, avoid shared passwords, and prefer short-lived tokens or a company single sign-on system.

Permissions

Least-privilege RBAC

Grant each person and program only the exact actions it needs. Avoid handing out the all-powerful cluster-admin role.

Policy

Admission controls

Use built-in Pod Security admission and policy engines to reject risky workloads before they are ever saved.

Secrets

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.

Visibility

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.

!
Keep versions fresh

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.

Analogy

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

ComponentWhat to watchWhy it matters
API serverRequest rate, error rate, and request durationSlow or failing requests slow every user and every controller
API serverRequests rejected for being too manySignals a noisy client or a runaway tool
etcdDisk sync durationSlow disks make the entire cluster slow
etcdLeader changes and database sizeFrequent elections show instability, and a full database blocks writes
SchedulerPending pods and scheduling latencyGrowing queues mean pods cannot find homes
Controller managerWork queue depth and retriesA deep queue means the controllers are falling behind
CertificatesDays until expiryExpired 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"]
Figure 5. Every control plane program publishes metrics and logs that flow to dashboards, alerts, and audit reviews.

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.

i
Alert on trends

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.

Analogy

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

Pattern

Declarative configuration

Describe the final state in files and apply them, instead of typing one-off commands. Files can be reviewed, versioned, and repeated.

Pattern

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.

Pattern

Admission policy as code

Write company rules once, such as required labels or banned settings, and let admission webhooks enforce them on every request.

Pattern

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

ANTI-PATTERN 01Avoid
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.

ANTI-PATTERN 02Avoid
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.

ANTI-PATTERN 03Avoid
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.

ANTI-PATTERN 04Avoid
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

1

Run three or five control plane nodes

Spread them across separate zones so a data-centre problem cannot remove the majority.

2

Give etcd fast, dedicated disks

Solid-state drives keep write delays small. Slow etcd is the top cause of a sluggish control plane.

3

Back up and rehearse

Take regular etcd snapshots, store them away from the cluster, and test a full restore a few times a year.

4

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.

5

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.

6

Watch and alert

Track API latency, etcd health, pending pods, and certificate expiry with alerts that reach a person.

Common mistakes and their fixes

MistakeWhat happensFix
Even number of etcd membersExtra cost without extra safety, and possible ties in electionsUse three or five members
Ignoring certificate expiryComponents suddenly refuse to talk to each otherMonitor expiry dates and renew automatically
Etcd on slow or shared disksFrequent leader elections and slow API responsesUse fast dedicated storage
Too many objects piling upOld jobs, events, and unused resources bloat the databaseSet clean-up rules and expiry times
Exposing the API server publiclyAttackers can scan and attack the door to your clusterLimit access to trusted networks and require strong authentication
Skipping several versions at onceLarge, risky upgrades that break removed featuresUpgrade one minor version at a time
No backup testingA restore fails at the worst momentPractise restores on a schedule
i
Learning order

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.

i
Rule of thumb

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.

Q1Is the control plane the same as the master node?
Yes, the two names describe the same idea. The older word “master” has been replaced in modern documentation by “control plane”, and the machines are called control plane nodes.
Q2What are the components of the Kubernetes control plane?
The core parts are the kube-apiserver, etcd, the kube-scheduler, and the kube-controller-manager. On cloud clusters there is also the cloud-controller-manager.
Q3Do my applications run on the control plane?
Normally not. Applications run on worker nodes. Control plane nodes usually carry a taint that keeps ordinary pods away, except in small learning clusters.
Q4What happens to my apps if the control plane goes down?
Existing pods usually continue to run and serve users. However, you cannot make changes, failed pods are not replaced, new pods are not scheduled, and autoscaling stops until the control plane returns.
Q5Why is etcd so important?
It is the only place where the cluster’s state is stored. Losing it without a backup means the cluster forgets what it is supposed to run.
Q6Why should I use an odd number of control plane nodes?
Voting needs a clear majority. Three members tolerate one failure and five tolerate two, while four tolerate no more than three. An extra even member adds cost with no gain in safety.
Q7What is the difference between the scheduler and the kubelet?
The scheduler chooses which node a pod should run on. The kubelet on that node then starts the containers and reports their health. One decides, the other acts.
Q8What is the control plane versus the data plane?
The control plane makes decisions and stores desired state. The data plane is the part that does the real work of carrying traffic and running containers, meaning the worker nodes and their networking.
Q9Can I see the control plane in Amazon EKS or Google GKE?
No. Managed services hide the control plane machines. You only interact with the API endpoint, and the provider takes care of the rest.
Q10What is a controller in Kubernetes?
A controller is a loop that watches one kind of object and works to make the actual state match the desired state. Built-in controllers live inside the controller manager, and you can add your own.
Q11Does the control plane cost money?
In self-managed clusters you pay for the machines it runs on. In managed services most providers add a small hourly fee for each cluster’s control plane, though some offer free tiers for basic use.
Q12How do I check the health of my control plane?
Use the API server’s health addresses, watch metrics from every component in Prometheus, and review control plane logs. Focus first on API latency, etcd disk speed, and certificate expiry dates.

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.