Skip to main content
With Kubernetes, the goal is to run your application as containers distributed across a set of machines (worker nodes) inside a cluster. Kubernetes does not schedule containers directly on nodes; instead it groups one or more containers into a higher-level object called a pod. A pod is the smallest deployable unit in Kubernetes and typically represents a single instance of your application. In the simplest setup you may have a single-node cluster with one pod containing a single container that runs your app. When you need to scale to handle more users, you add additional pod instances — not additional containers inside an existing pod. Each new pod runs its own container instance, and the scheduler places pods on nodes according to available capacity. If nodes run out of capacity you can add more nodes and schedule pods onto them, preserving the common one-to-one relationship between a pod and the application container it holds.
A stylized diagram of a Kubernetes cluster showing pods running on nodes. Six user icons at the top with arrows point down to the pods, illustrating users or traffic reaching those pods.
Key points:
  • Pods are the smallest object you create in Kubernetes.
  • You scale an application by creating or deleting pods.
  • You do not scale by adding additional application containers into an existing pod.
Although most pods contain a single container, a pod can host multiple containers that share the same network namespace and storage volumes. Multi-container pods are useful for co-located helper processes such as sidecar containers for logging, monitoring, proxying, or caching. All containers in a pod are created and terminated together.
A slide titled "Multi-Container Pods" showing a Kubernetes node containing a pod with multiple containers and a small network cloud between them. A callout labels these as "Helper Containers," and the container icons include a Python logo and another service icon.
Deploying pods
  • Historically kubectl run created a Pod object, but in recent kubectl versions it defaults to creating a controller (like a Deployment) that manages pods. If you explicitly want a bare Pod object, set the restart policy to Never.
  • Images are pulled from registries (Docker Hub by default). For private registries use image pull secrets.
Create a single Pod named nginx that runs the official nginx image:
Note: On modern kubectl releases, kubectl run without --restart=Never will create a controller that manages pods. Use --restart=Never to create a single Pod object that is not managed by a controller.
Inspecting pods List pods in the current namespace:
Example output immediately after creating a pod:
  • READY shows how many containers in the pod are ready vs. the total.
  • STATUS indicates the pod lifecycle state (e.g., Pending, ContainerCreating, Running, CrashLoopBackOff, Succeeded, Failed).
  • RESTARTS is the number of times containers in the pod have restarted.
Common pod statuses and what they mean: Useful commands When to use a bare Pod vs a controller
  • Use a bare Pod object for one-off tasks, debugging, or learning.
  • For production workloads and scaling, use higher-level controllers (Deployments, ReplicaSets, StatefulSets) to manage pod lifecycle, autoscaling, and rolling updates.
Summary This lesson covered the pod concept in Kubernetes: what pods are, how they relate to containers, when to use multi-container pods, and the core commands to create and inspect pods. For production workloads prefer controllers (e.g., Deployments) to manage scaling and availability rather than creating many unmanaged Pod objects. Links and references

Watch Video

Practice Lab