Kubernetes Core Concepts: Architecture, Pods, Deployments, and Services
Kubernetes core concepts are the building blocks of every cluster: a control plane that stores and enforces desired state, worker nodes that run containers, and a small set of API objects - Pods, ReplicaSets, Deployments, Services, and namespaces - that describe what should run and how it is reached. Kubernetes works declaratively: you submit a manifest describing the state you want, and controllers continuously reconcile reality toward it. KCNA questions on this topic ask which component performs a given job, what a Pod actually is, how a Deployment relates to a ReplicaSet, and - in scenario form - what happens when something fails or is changed. This lesson walks through the cluster architecture component by component, then the workload and networking objects, how rollouts and ownership behave, the reconciliation loop that ties them together, and the blast radius of each component failure.
On this page10 sections
- One cluster, two kinds of nodes
- Inside the control plane
- What runs on every worker node
- Pods: the smallest deployable unit
- ReplicaSets and Deployments: from replicas to rollouts
- Rolling updates, rollbacks, and ownership
- Services: stable networking for ephemeral Pods
- Namespaces, labels, and selectors
- Declarative configuration and the reconciliation loop
- When a control plane component fails
- Describe the roles of the control plane and worker nodes in a Kubernetes cluster
- Identify what the API server, etcd, scheduler, controller-manager, cloud-controller-manager, kubelet, and kube-proxy each do
- Explain why the Pod is the smallest deployable unit, what its containers share, and how sidecars share files
- Distinguish Pods, ReplicaSets, Deployments, StatefulSets, DaemonSets, Jobs, and CronJobs and pick the right one for a scenario
- Explain rolling-update limits, rollbacks, owner references, and cascading deletion
- Explain how Services, readiness probes, labels, selectors, and namespaces connect objects
- Summarize the desired-state reconciliation loop behind declarative configuration
- Predict what keeps working and what stops when a control plane or node component fails
One cluster, two kinds of nodes
A Kubernetes cluster is a set of machines, called nodes, that run containerized applications. Every node plays one of two roles. Control plane nodes host the components that make global decisions: they expose the API, store cluster state, decide where workloads run, and detect and respond to events such as a crashed container. Worker nodes do the actual running: each one hosts the agents that start containers, keep them healthy, and route traffic to them.
The split matters because it explains the answer to a whole family of exam questions. When you are asked which component schedules a Pod, stores state, or forwards Service traffic, the first filter is: does that job belong to the brain of the cluster or to the muscle? The table below is the map you should memorize.
| Where it runs | Component | One-line job |
|---|---|---|
| Control plane | kube-apiserver | Front door for all cluster communication |
| Control plane | etcd | Key-value datastore holding all cluster state |
| Control plane | kube-scheduler | Picks a node for each new Pod |
| Control plane | kube-controller-manager | Runs the reconciliation controllers |
| Worker node | kubelet | Starts Pods and keeps their containers running |
| Worker node | kube-proxy | Programs network rules so Service traffic reaches Pods |
| Worker node | Container runtime | Actually runs the containers (for example containerd or CRI-O) |
Note that the kubelet and a container runtime also run on control plane nodes in most setups, which is how the control plane components themselves can run as Pods. In managed cloud offerings such as EKS, AKS, and GKE, the provider operates the control plane for you and you mostly interact with worker nodes and the API.
Inside the control plane
The kube-apiserver is the front end of the control plane and the only component every other part of the system talks to. All communication - from kubectl, from the kubelet on each node, from controllers, from dashboards - flows through its REST API. It authenticates each request, authorizes it, validates the object, and persists it. Nothing bypasses it: components never talk to each other directly about cluster state, and clients never talk to etcd directly.
etcd is a consistent, distributed key-value store that acts as the cluster's single source of truth. Every object you create - Pods, Deployments, Services, ConfigMaps, Secrets - is stored in etcd. Only the API server reads from and writes to etcd. If etcd loses its data and you have no backup, the cluster forgets everything it was supposed to be running, which is why an etcd snapshot is the canonical cluster backup: it captures every Deployment, Service, ConfigMap and Secret in one place.
Production control planes run etcd as a cluster of an odd number of members (three or five) because etcd only accepts writes while a quorum - a majority of members - is healthy. A three-member cluster tolerates one failed member; a five-member cluster tolerates two. If a three-member cluster loses two members, the survivor cannot form a majority, so the API server can no longer persist any change: creates, updates, scaling and deletes all fail. Workloads already running are not affected, because the kubelets on the nodes keep their containers running without consulting etcd. The cluster is frozen, not down.
The kube-scheduler watches for newly created Pods that have no node assigned and selects a node for each one. It filters out nodes that cannot fit the Pod (insufficient CPU or memory, unsatisfied constraints) and scores the remainder to pick the best. Crucially, the scheduler only makes the placement decision; it does not start containers.
The kube-controller-manager runs the built-in controllers as a single process: the ReplicaSet controller, the Deployment controller, the Job and CronJob controllers, the StatefulSet and DaemonSet controllers, the node controller, and many more. Each controller runs a watch loop that compares desired state with observed state and issues API requests to close the gap. The node controller is the one that watches node heartbeats: every kubelet regularly renews a Lease object and reports node status, and when those heartbeats stop for longer than a grace period, the node controller marks the node NotReady (its Ready condition becomes Unknown) and taints it, after which the Pods on it are evicted so their controllers can replace them elsewhere.
A separate cloud-controller-manager holds the controllers that must call a cloud provider's API, so that core Kubernetes stays provider-neutral. Its service controller is what provisions an external load balancer when you create a Service of type LoadBalancer; its node and route controllers label nodes with cloud metadata and program cloud network routes. The two are easy to confuse, so keep the split clear:
| Component | Runs | Example job |
|---|---|---|
| kube-controller-manager | Provider-neutral built-in controllers | Replacing a missing ReplicaSet Pod; marking a silent node NotReady |
| cloud-controller-manager | Controllers that talk to the cloud provider | Creating the cloud load balancer for a LoadBalancer Service |
| kube-proxy (on each node) | Node-local Service forwarding rules | Routing ClusterIP traffic to backend Pods - it never creates cloud resources |
What runs on every worker node
The kubelet is the node agent. It registers the node with the API server, watches for Pods scheduled to its node, and makes sure the containers described in each PodSpec are running and healthy. It instructs the container runtime to pull images and start containers, runs liveness and readiness probes, and reports Pod and node status back to the API server. Remember the boundary: the kubelet manages containers that belong to Kubernetes Pods, not arbitrary containers someone started by hand on the node.
The kubelet is also the source of the node's heartbeat. If the kubelet process stops while the container runtime keeps going, the containers already running on that node carry on serving - the runtime does not need the kubelet to keep them alive - but nothing is restarting failed containers or reporting status any more, so after the grace period the node controller sets the node's Ready condition to Unknown (which kubectl shows as NotReady) and its Pods are eventually evicted and replaced elsewhere.
Two of the probes the kubelet runs are easy to confuse because they react to failure in completely different ways:
| Probe | Question it answers | What happens when it fails |
|---|---|---|
| Readiness | Can this container accept traffic right now? | The Pod is marked not ready and Services stop sending it traffic; the container is not restarted. Traffic resumes when the probe passes again. |
| Liveness | Is this container still working at all? | The kubelet kills and restarts the container (subject to the Pod's restart policy). |
| Startup | Has a slow-starting app finished starting? | Liveness and readiness checks are held off until it succeeds; if it never does, the container is restarted. |
The container runtime is the software that actually runs containers. Kubernetes talks to it through the Container Runtime Interface (CRI), a standard API that lets any conformant runtime plug in. The common choices are containerd and CRI-O. Docker Engine is not a CRI runtime by itself; Kubernetes removed its special-case Docker integration (dockershim) in version 1.24, and Docker-built images continue to run fine because they follow the OCI image standard.
kube-proxy runs on each node and implements the Service abstraction at the network level. It watches Services and their backing endpoints through the API server and programs forwarding rules on the node - typically iptables or IPVS rules - so that traffic sent to a Service's virtual IP is routed to one of the healthy Pods behind it. Despite the name, it usually does not proxy packets through itself; it programs the kernel to do the forwarding. Because those rules are per node, a kube-proxy problem is confined to its own node and to Service traffic: direct Pod-to-Pod traffic by Pod IP does not depend on kube-proxy, so it keeps working, while Service virtual IPs on that node stop being routed correctly. If kube-proxy merely stops, the rules it already programmed remain but go stale - new Services and endpoint changes are not picked up - so Service traffic from that node fails or reaches outdated endpoints, while other nodes are unaffected.
A useful exam heuristic: if a question is about deciding or recording, the answer is a control plane component; if it is about running containers or moving packets on a node, the answer is the kubelet, the runtime, or kube-proxy.
Pods: the smallest deployable unit
A Pod is the smallest deployable unit in Kubernetes. You never deploy a bare container; you deploy a Pod that wraps one or more containers. The containers in a Pod are always scheduled together onto the same node, and they share two things: a network namespace - one IP address, one port space, so they can reach each other on localhost - and optionally volumes, shared storage directories that any container in the Pod can mount.
Most Pods hold a single application container. Multi-container Pods exist for tightly coupled helpers: a log-shipping sidecar, a proxy that terminates TLS in front of the app, or an init container that runs setup work to completion before the main container starts. If two processes scale independently or do not need to share an IP and volumes, they belong in separate Pods: a Pod is the unit of scaling, so every replica of a Pod carries a copy of every container in it. Putting an API server and its session store in one Pod means scaling the API to six replicas also creates six separate, unshared session stores.
Sharing files between containers in a Pod is done with a Pod-level volume. The classic example is an emptyDir volume: it is created empty when the Pod starts, lives as long as the Pod, and can be mounted by several containers - often at different paths. An application writes its log files into the emptyDir and a log-shipping sidecar mounts the same volume and reads them, with no change to the application. Not every volume type is writable: configMap and secret volumes are mounted read-only, so they can deliver configuration into a container but cannot be used to pass data between containers. Kubernetes also supports native sidecar containers - init containers with restartPolicy: Always - which start before the main container and keep running alongside it.
A minimal Pod manifest looks like this:
apiVersion: v1
kind: Pod
metadata:
name: web
labels:
app: web
spec:
containers:
- name: web
image: nginx:1.27
ports:
- containerPort: 80Pods are ephemeral. They are not resurrected when they die: if a node fails, the Pods on it are lost, and a replacement Pod is a new object with a new name and a new IP. A Pod created directly from a Pod manifest, with no controller owning it, is simply gone when its node fails: nothing exists whose job is to recreate it. That is why you almost never create Pods directly in production. Instead you create a controller object such as a Deployment, which creates and replaces Pods for you, and a Service, which gives clients a stable address in front of the churn. Both patterns follow in the next sections.
ReplicaSets and Deployments: from replicas to rollouts
A ReplicaSet has one job: keep a specified number of identical Pod replicas running. It uses a label selector to count the Pods it owns; if there are too few it creates more from its Pod template, and if there are too many it deletes the extras. This gives you self-healing and horizontal scale, but nothing else - a ReplicaSet has no concept of versions or updates.
Because a ReplicaSet counts Pods by selector rather than by remembering which Pods it created, it can acquire Pods it never made. If you create a standalone Pod (one with no controller owning it) whose labels match a running ReplicaSet's selector, the ReplicaSet adopts it - sets itself as the Pod's owner - and now counts one Pod too many, so it deletes a Pod to return to the desired count. This is why labels used by controller selectors should not be reused on unrelated Pods.
A Deployment sits one level above. It manages ReplicaSets and provides declarative rolling updates and rollbacks. When you change a Deployment's Pod template - for example, a new image tag - the Deployment creates a new ReplicaSet and gradually scales it up while scaling the old one down, keeping the app available throughout. Because old ReplicaSets are retained as revision history, kubectl rollout undo deployment/web can roll back to the previous version. In everyday work you create Deployments and let them own the ReplicaSets; you rarely create a ReplicaSet directly.
| Object | What it gives you | When you use it |
|---|---|---|
| Pod | One deployable unit of one or more containers | Almost never directly; debugging and one-off tasks |
| ReplicaSet | Keeps N identical Pod replicas alive | Rarely directly; created and managed by Deployments |
| Deployment | Declarative rollouts, rollbacks, and scaling of ReplicaSets | The default choice for stateless applications |
Other workload controllers cover other shapes at the same conceptual level, and matching the shape to the controller is a core skill:
| Controller | Workload shape | Typical example |
|---|---|---|
| Deployment | Interchangeable, stateless replicas | Web front ends, APIs |
| StatefulSet | Replicas with a stable identity and their own storage | Database or message-queue clusters |
| DaemonSet | One Pod on every (or every matching) node, including nodes added later | Log collectors, monitoring and network agents |
| Job | Run to completion once | A batch migration or data export |
| CronJob | Run a Job on a schedule | A nightly report at 02:00 |
A StatefulSet gives each replica a stable ordinal name - db-0, db-1, db-2 - and, through its volumeClaimTemplates, its own PersistentVolumeClaim per replica. When db-1 is rescheduled to another node it comes back with the same name and reattaches to the same claim, so its data follows it. A Deployment cannot do this: its Pods get random names and share whatever volumes the template names.
Rolling updates, rollbacks, and ownership
A Deployment rollout replaces old Pods with new ones in controlled steps, governed by two settings of the default RollingUpdate strategy. maxUnavailable caps how many of the desired Pods may be unavailable during the update, and maxSurge caps how many extra Pods may exist above the desired count; both default to 25% (maxUnavailable rounds down, maxSurge rounds up). With replicas: 10, 25% is 2.5, so at most two Pods may be unavailable (rounded down) and at most three extra Pods may exist (rounded up) at any moment.
Those limits are what protect you from a bad release. If the new Pods never become ready - because the image cannot be pulled, the container crashes on start, or the readiness probe never passes - the Deployment cannot remove more old Pods than maxUnavailable allows, so most of the old Pods keep serving and the rollout simply stalls. After progressDeadlineSeconds (600 seconds by default) the Deployment reports a Progressing condition of False with reason ProgressDeadlineExceeded. That is a signal only: Kubernetes does not roll back automatically. A person or a tool must fix the template or undo the rollout.
To go back, use kubectl rollout undo deployment/web (optionally --to-revision=N; kubectl rollout history lists the revisions). It restores the previous Pod template, and the Deployment scales the old ReplicaSet back up. Deleting a ReplicaSet is not a rollback.
Underneath all of this is ownership. Each Pod carries an owner reference to its ReplicaSet, and each ReplicaSet to its Deployment. Two consequences follow:
- The owner's spec wins. If you run
kubectl scaleon a ReplicaSet that a Deployment owns - say from 2 to 5 - the Deployment controller notices the ReplicaSet no longer matches the Deployment's ownreplicas: 2and scales it straight back. Change the Deployment, not the objects it manages. - Deletion cascades. Deleting an owner deletes its dependents by default (background cascading deletion), so
kubectl delete replicaseton a Deployment's current ReplicaSet deletes its Pods too. The Deployment then sees it has no ReplicaSet for its current template and creates a new one, which creates new Pods - from the current template, not an older one. Passing--cascade=orphandeletes only the owner and leaves the dependents running without an owner.
Services: stable networking for ephemeral Pods
Pods come and go, and every new Pod gets a new IP address. Clients cannot chase that churn, so Kubernetes provides the Service: an object that defines a stable virtual IP (the ClusterIP) and a stable DNS name in front of a dynamic set of Pods. The Service selects its backend Pods with a label selector; whichever Pods currently match the selector and pass their readiness checks receive the traffic. The set of matching Pod addresses is tracked in EndpointSlice objects, and kube-proxy on every node programs the rules that spread connections across them. A Pod that is running but failing its readiness probe is kept out of the ready endpoints, so it gets no Service traffic until the probe passes again.
A Service is not attached to a Deployment or any other controller - it is attached only to labels. The Service's selector and the Deployment's selector are independent, and each just matches Pod labels. That makes a classic mistake easy: if a rollout changes the Pod template's labels (for example track: stable to track: canary) while the Service still selects track=stable, the rollout completes happily, the old Pods are removed, and the Service is left with no endpoints. Clients get connection failures even though every Pod is healthy. Keep Service selectors on the stable labels (such as app) that all versions share.
Service types build on each other, and the exam expects you to match type to scenario:
- ClusterIP (the default): a virtual IP reachable only inside the cluster. Use it for internal service-to-service traffic.
- NodePort: additionally opens the same port on every node, so external clients can reach the Service at any node's IP on that port.
- LoadBalancer: additionally asks the cloud provider to provision an external load balancer that forwards to the Service. The standard way to expose an app publicly on a managed cloud cluster.
- ExternalName: no proxying at all; it returns a DNS CNAME pointing at an external hostname.
In-cluster DNS makes discovery simple: a Service named db in namespace prod resolves as db from inside that namespace, or as db.prod.svc.cluster.local from anywhere in the cluster. For HTTP routing concerns such as virtual hosts and paths, an Ingress (or the newer Gateway API) sits in front of Services, but the Service remains the stable target underneath.
Namespaces, labels, and selectors
Namespaces divide one physical cluster into virtual slices. Object names must be unique only within a namespace, so team A and team B can each have a Deployment called api without colliding. Namespaces are also the scope for access control and resource limits, which makes them the standard boundary between teams, environments, or applications sharing a cluster. Every cluster starts with a few: default (where objects land when you specify nothing), kube-system (Kubernetes' own components), kube-public, and kube-node-lease. Not everything is namespaced - nodes and PersistentVolumes, for example, are cluster-scoped.
When you create a namespaced object with kubectl, its namespace is resolved in this order: the metadata.namespace in the manifest or the -n/--namespace flag (if both are given and they disagree, kubectl refuses with an error); otherwise the namespace set on the current kubeconfig context; otherwise default.
Labels are key-value pairs attached to objects, such as app: web or tier: frontend. They carry no meaning to Kubernetes by themselves; their power is that other objects select on them. A selector is a query over labels, and it is the glue of the whole object model: a ReplicaSet's selector.matchLabels decides which Pods it counts as its replicas, and a Service's selector decides which Pods receive its traffic. You can use the same mechanism interactively: kubectl get pods -l app=web lists only the matching Pods.
Two distinctions are worth locking in for the exam. First, labels are for selection; annotations are also key-value metadata but are for non-identifying information (build numbers, tool configuration) and cannot be used in selectors. Second, namespaces isolate names and policy, not the network: by default, Pods in different namespaces can still reach each other, and restricting that traffic is the job of NetworkPolicies.
Declarative configuration and the reconciliation loop
Kubernetes is a declarative system. You do not send it a sequence of commands to execute; you send it a manifest - typically YAML - that describes the desired state, and you apply it with kubectl apply -f deployment.yaml. The API server validates the object and stores it in etcd. From that moment, a set of controllers works continuously to make the observed state of the cluster match what you declared. This watch-compare-act cycle is the reconciliation loop, and it never stops: it is not a one-time deployment script but a standing promise.
Walk through a concrete scenario. You apply a Deployment named web with replicas: 3. The Deployment controller sees it and creates a ReplicaSet; the ReplicaSet controller sees it needs three Pods and creates three Pod objects; the scheduler assigns each Pod to a node; the kubelet on each chosen node sees a Pod bound to it and tells the container runtime to pull the image and start the containers; kube-proxy updates its rules so the web Service can reach them. Now a worker node dies. The node controller marks it unhealthy, its Pods are eventually removed, the ReplicaSet controller observes two replicas where three are desired, and it creates a replacement Pod, which is scheduled onto a surviving node and started. Nobody paged an operator; the loop healed the gap.
This is why declared state beats imperative commands: the same manifest can be applied repeatedly with the same result, stored in version control, and reviewed like code - the foundation of GitOps. It is also the definition of self-healing that KCNA questions probe: Kubernetes does not prevent failures, it detects divergence from desired state and corrects it.
When a control plane component fails
Every component failure has a predictable blast radius, and it always follows from the division of labour: running containers depend only on the kubelet and runtime of their own node, while every change needs the API server, etcd, and whichever controller or scheduler acts on it. So a control plane outage almost never stops running applications - it stops the cluster from changing or healing.
| What fails | What stops | What keeps working |
|---|---|---|
| kube-apiserver | kubectl requests fail because nothing answers at the cluster API endpoint; controllers and the scheduler cannot read or write, so rollouts stall and nothing is replaced | Existing Pods keep running and serving traffic |
| etcd loses quorum | The API server cannot persist any change | Existing Pods keep running |
| kube-scheduler | New Pods stay Pending with no node assigned | Pods already bound to nodes are untouched; the API still accepts objects |
| kube-controller-manager | Nothing creates replacements for failed Pods, rolls out Deployments, or marks dead nodes NotReady | Surviving Pods keep serving; the API and scheduler work |
| kubelet on one node | That node stops reporting and goes NotReady; failed containers there are not restarted | Its already-running containers keep running until evicted |
| kube-proxy on one node | Service ClusterIP traffic from that node fails or goes stale | Direct Pod-IP traffic and all other nodes |
Once the failed component returns, the reconciliation loop catches up: the scheduler binds the Pending Pods, the controller manager notices missing replicas and creates them. Nothing has to be replayed, because desired state was never lost - it is still in etcd.
Tip. KCNA tests this topic at two depths. Recognition: which component stores cluster state (etcd), which is the single entry point (kube-apiserver), which assigns Pods to nodes (kube-scheduler), which runs containers on a node (kubelet), which programs Service rules (kube-proxy), and which object fits a workload shape (Deployment, StatefulSet, DaemonSet, Job, CronJob). Scenario: reason from the division of labour - a failed component stops change or healing but leaves running Pods alone; a readiness failure removes traffic while a liveness failure restarts; a Deployment's spec overrides edits to the ReplicaSets it owns; a Service follows labels, not Deployments; a stalled rollout is not undone automatically. Common distractors swap the scheduler for the kubelet, the controller-manager for the cloud-controller-manager, or claim kubectl talks to etcd directly.
- A Pod is the smallest deployable unit; its containers share one network namespace (one IP) and can share volumes such as an emptyDir.
- The kube-apiserver is the front door: kubectl, the kubelet, and all controllers talk to the cluster only through it.
- etcd is the cluster's key-value datastore and single source of truth; it needs a majority quorum to accept writes, and an etcd snapshot is the cluster backup.
- The kube-scheduler only picks a node for each Pod; the kubelet on that node starts the containers via the runtime and sends the node heartbeat.
- kube-controller-manager runs the provider-neutral controllers (including the node controller); cloud-controller-manager provisions cloud resources such as LoadBalancer Services.
- A ReplicaSet keeps N Pods matching its selector alive; a Deployment owns ReplicaSets and adds rolling updates (maxSurge/maxUnavailable) and rollback via kubectl rollout undo, with no automatic rollback on failure.
- A Service gives a stable virtual IP and DNS name to the ready Pods matching its selector; readiness failures remove a Pod from traffic, liveness failures restart it.
- Namespaces scope names, access, and quotas; labels plus selectors are the glue that connects Services and controllers to Pods.
- Kubernetes is declarative: controllers continuously reconcile observed state toward the desired state stored in etcd, so control plane outages freeze change and healing but leave running Pods running.
Frequently asked questions
What is the smallest deployable unit in Kubernetes?
The Pod. Kubernetes never runs a bare container; every container runs inside a Pod, which can hold one or more containers that are scheduled onto the same node together and share a single IP address, port space, and optionally volumes. In practice most Pods contain one main application container, with extra containers reserved for tightly coupled helpers such as sidecars.
What is the difference between a Deployment and a ReplicaSet?
A ReplicaSet only keeps a fixed number of identical Pod replicas running. A Deployment manages ReplicaSets on your behalf and adds declarative rolling updates and rollbacks: when you change the Pod template, the Deployment creates a new ReplicaSet and shifts replicas over gradually, keeping the old one as revision history so you can roll back. You normally create Deployments and let them own the ReplicaSets.
What does the kube-apiserver do?
The kube-apiserver is the front end of the control plane and the only component clients and other components communicate with. It exposes the Kubernetes REST API, authenticates and authorizes every request, validates objects, and persists them to etcd. Everything - kubectl commands, kubelet status reports, controller actions - flows through the API server.
Why do Pods need Services?
Because Pods are ephemeral: they are replaced rather than repaired, and each replacement gets a new IP address. A Service provides a stable virtual IP and DNS name in front of the Pods that match its label selector, so clients keep one address while the backing Pods scale, fail, and get replaced underneath it. kube-proxy programs the rules that spread traffic across the current healthy Pods.
What is etcd used for in Kubernetes?
etcd is the consistent, distributed key-value store where the entire cluster state lives: every Pod, Deployment, Service, ConfigMap, and Secret you create is persisted there. Only the kube-apiserver talks to etcd directly, and backing up etcd is the standard way to back up a cluster, because losing it means losing the record of everything the cluster should be running.
Is the scheduler responsible for starting containers?
No. The kube-scheduler only decides which node a new Pod should run on, by filtering out nodes that cannot fit it and scoring the rest. The kubelet on the chosen node is what actually starts the Pod, by instructing the container runtime (such as containerd or CRI-O) to pull the image and run the containers.
What happens to running applications if the Kubernetes control plane goes down?
They keep running. Containers on a node are kept alive by that node's kubelet and container runtime, which do not need the control plane moment to moment. What stops is change and healing: with the kube-apiserver down kubectl fails and no controller can act; with the scheduler down new Pods stay Pending; with the controller manager down failed Pods are not replaced. When the component returns, the controllers reconcile back to the desired state still stored in etcd.
Does a Kubernetes Deployment roll back automatically when an update fails?
No. During a rolling update, maxUnavailable and maxSurge (25% each by default) limit how many old Pods can be removed, so if the new Pods never become ready most old Pods keep serving and the rollout stalls. After progressDeadlineSeconds (600 seconds by default) the Deployment reports ProgressDeadlineExceeded, but it does not revert itself. You roll back with kubectl rollout undo, which restores the previous Pod template.
Source
This lesson covers the "Kubernetes Fundamentals" domain of the official KCNA exam guide. Vendors revise their guides — check the source for the current version.
- KCNA certification page and curriculum — The Linux Foundation
Sign up free to mark lessons complete, bookmark topics and track your exam readiness.