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.

The last post explained containers; this post covers the smallest thing Kubernetes actually manages: the pod. A pod is one or more containers that run together — sharing network and storage — as a single unit. Kubernetes schedules, scales, and manages pods, not individual containers, and understanding why is key to understanding Kubernetes. This post covers what a pod is, why it exists, the sidecar pattern, and the pod lifecycle.

What a pod is

A pod is the smallest deployable unit in Kubernetes: one or more containers that are always scheduled together on the same node and share certain resources. The key facts:

So a pod is a wrapper that groups tightly-coupled containers into one co-located, co-scheduled unit with a shared network and storage. Kubernetes then manages pods as the atomic unit — it schedules pods onto nodes, scales by adding/removing pods, and reconciles the number of pods (from the desired-state model). The container is what runs your code; the pod is what Kubernetes manages.

Why not just containers?

The natural question: why add the pod abstraction instead of managing containers directly? Because some containers genuinely need to run together, sharing an environment, and a single-container-only model couldn’t express that. The pod exists so Kubernetes can schedule co-located, co-operating containers as one unit:

If Kubernetes managed only individual containers, you couldn’t guarantee two related containers land on the same node, share a network/storage, and live together. The pod is the abstraction that provides “these containers are a unit.” Most pods have one container (you don’t need the grouping), but when you do need tightly-coupled containers together, the pod is the mechanism — and making the pod (not the container) the universal unit of scheduling keeps Kubernetes’s model uniform (everything schedules pods, whether they hold one container or several).

The sidecar pattern

The main reason a pod holds multiple containers is the sidecar pattern — running a helper container alongside the main application container in the same pod, to augment or support it:

Pod
├── app container        (your application)
└── sidecar container    (a helper: log shipping / proxy / config sync)
    → share network (localhost) and storage (volumes), scheduled together

Common sidecars:

The sidecar pattern is powerful because it lets you add capabilities to a pod without changing the app — the app focuses on its job, and sidecars handle cross-cutting concerns (logging, networking, security) alongside it, sharing the pod’s network and storage. This is a big part of why pods allow multiple containers: it enables composing an application with helpers as a co-located unit. (Kubernetes also has init containers — containers that run to completion before the main container starts, for setup tasks — another use of multiple containers in a pod.)

The pod lifecycle and ephemerality

A crucial property to internalize: pods are ephemeral. They are created, they run, and they are destroyed — and Kubernetes creates new pods rather than resurrecting old ones. This shapes how you think about everything:

The ephemerality has big consequences that later posts address:

So the mental model: a pod is Kubernetes’s atomic, ephemeral unit — one-or-more co-located containers sharing network/storage, created and destroyed freely, managed by higher-level controllers, and treated as replaceable cattle. This ephemerality is fundamental to how Kubernetes self-heals and scales (just make more/fewer pods), and it’s why the concepts that follow — controllers (managing pods), services (stable addressing over changing pods), and volumes (state outside disposable pods) — exist. The next post covers what actually manages pods to achieve the desired state: controllers and the reconciliation loop.

Key takeaways

Further reading

Sources & References