Kubernetes from First Principles

Kubernetes learned from the ground up — the problem it solves (declarative desired state + reconciliation), containers (namespaces/cgroups/images), pods, controllers, services and networking, configuration and state, scheduling and resources, and operators and production.

8 parts · written by Pratik Dhanave. Start with Part 1 →

← All series · All posts

Part 1 · ·7 min read

What Problem Does Kubernetes Solve?

Kubernetes is famously complex, and most explanations start with its parts — pods, deployments, services — which is exactly backwards. Start with the problem: you have containers, you have many machines, and you need something to run the right containers on the right machines and keep them running as things fail. Kubernetes is a control loop for that, and once you see it that way, the complexity becomes comprehensible.

Kubernetes is famously complex, and most explanations start with its parts — which is backwards. Start with the problem: you have containers, many machines, and need something to run the right containers on the right machines and keep them running as things fail.

Part 2 · ·7 min read

Containers from First Principles

A container feels like a lightweight virtual machine, but it isn't one — there's no guest OS, no hypervisor, no virtualization. A container is just a normal process that the Linux kernel has been told to isolate and constrain. Understanding that — namespaces for isolation, cgroups for limits, images for packaging — demystifies containers and everything Kubernetes builds on them.

A container feels like a lightweight virtual machine, but it isn't one — no guest OS, no hypervisor, no virtualization. A container is just a normal process the Linux kernel has been told to isolate (namespaces) and constrain (cgroups).

Part 3 · ·7 min read

Pods: The Atom of Kubernetes

Kubernetes doesn't run containers directly — it runs pods. This surprises newcomers: why wrap a container in another abstraction? Because the pod solves a real problem — some containers genuinely need to run together, sharing network and storage — and making the pod (not the container) the unit of scheduling is what makes the rest of Kubernetes coherent.

Kubernetes doesn't run containers directly — it runs pods. Why wrap a container in another abstraction? Because some containers genuinely need to run together sharing network and storage, and making the pod the unit of scheduling keeps the rest of Kubernetes coherent.

Part 4 · ·6 min read

Controllers and the Reconciliation Loop

Controllers are where Kubernetes's core idea — declarative desired state plus reconciliation — becomes machinery. A controller is a loop that watches "what you want" versus "what exists" and acts to close the gap, forever. Self-healing, scaling, and zero-downtime rollouts are all just controllers doing that one thing. This is the engine of Kubernetes.

Controllers are where Kubernetes's core idea — declarative desired state plus reconciliation — becomes machinery. A controller is a loop that watches what you want versus what exists and acts to close the gap, forever. Self-healing, scaling, and rollouts are all just that.

Part 5 · ·8 min read

Services and Networking

Pods are ephemeral and get new IPs every time they're replaced, so how does anything reliably reach them? The Service — a stable address and load balancer in front of an ever-changing set of pods. Kubernetes networking looks intimidating, but it's a few clear layers solving one problem: stable communication over unstable pods.

Pods are ephemeral and get new IPs every time they're replaced, so how does anything reliably reach them? The Service — a stable address and load balancer in front of an ever-changing set of pods. Kubernetes networking is a few layers solving one problem.

Part 6 · ·7 min read

Configuration and State

Pods are disposable — destroyed and recreated constantly — which raises two problems: how do you give a pod its configuration without baking it into the image, and how does any data survive a pod's death? ConfigMaps and Secrets answer the first; volumes and StatefulSets answer the second. This is how stateless-by-default Kubernetes handles config and the state it can't avoid.

Pods are disposable, which raises two problems: how to give a pod its config without baking it into the image, and how any data survives a pod's death. ConfigMaps and Secrets answer the first; volumes and StatefulSets answer the second.

Part 7 · ·7 min read

Scheduling and Resources

Kubernetes has to answer a question every time a pod is created: which machine should run it? The scheduler answers it, and the quality of that answer depends entirely on information you provide — resource requests and limits. Get those right and the cluster packs efficiently and stays stable; get them wrong and you get waste, evictions, and mysterious outages.

Kubernetes answers a question every time a pod is created: which machine runs it? The scheduler answers it, and the quality depends on resource requests and limits you provide. Get those wrong and you get waste, evictions, and mysterious outages.

Part 8 · ·7 min read

Operators and Kubernetes in Production

Kubernetes's deepest idea isn't its built-in objects — it's that the reconciliation model is extensible. You can teach Kubernetes new concepts and automate operating them, which is what operators do. This closing post covers that extension model, the realities of running Kubernetes in production, and the honest verdict on when its power is worth its complexity.

Kubernetes's deepest idea isn't its built-in objects — it's that the reconciliation model is extensible. You can teach Kubernetes new concepts and automate operating them, which is what operators do. Plus the realities of running it in production, and when it's worth the complexity.

This series is part of a larger body of work by Pratik Dhanave, an Agentic AI Architect writing about production AI systems, distributed systems, and cloud-native engineering. Explore all course series, browse every post, or find topics via the tag index.