Kubernetes is not a container runner — it is a distributed system for declaring the desired state of a cluster and continuously reconciling the actual state toward that declaration. This distinction is foundational: when you create a Deployment, you are not instructing Kubernetes to run containers; you are writing a desired state into etcd, the cluster's distributed key-value store, and a set of independent control loops — controllers — each observe a small slice of that state and take the minimum action required to converge the actual cluster toward it. Understanding this reconciliation architecture is what separates engineers who fight Kubernetes from those who work with it, because every behaviour that initially seems mysterious — why does a deleted Pod reappear, why does a Service endpoint update take seconds, why does a rolling update pause midway — is a direct consequence of a specific controller performing a reconciliation step on a specific piece of state.
The control plane is the set of components that manage cluster-wide state: the API server, which is the single authoritative gateway for all cluster state reads and writes; etcd, which stores that state durably and notifies watchers of changes; the scheduler, which assigns unscheduled Pods to worker nodes; and the controller manager, which runs dozens of control loops that reconcile object states. Worker nodes run the kubelet, which receives Pod specs from the API server and instructs the container runtime to create, start, and monitor containers; the container runtime itself (typically containerd); and kube-proxy, which programs the node's iptables or eBPF rules to implement Service routing. Every cluster operation — applying a manifest, deleting a resource, scaling a Deployment — flows through this architecture in a deterministic sequence that is fully observable via the API.