A Pod represents a single instance of a running process in your Kubernetes cluster and can contain one or more containers. Think of a Pod as a lightweight, application-specific logical host. All containers within a Pod are co-located on the same worker node and share the same execution environment.
This shared context is what makes Pods special, and it includes:
Shared Networking Each Pod gets a unique IP address. All containers within that Pod share this IP and port space, allowing them to communicate with each other over localhost.
Shared Storage Containers in a Pod can share storage volumes, providing a common filesystem for data exchange and persistence.
The Pod Lifecycle A Pod progresses through several lifecycle phases:
Pending: The Pod has been accepted by the Kubernetes …
A Pod represents a single instance of a running process in your Kubernetes cluster and can contain one or more containers. Think of a Pod as a lightweight, application-specific logical host. All containers within a Pod are co-located on the same worker node and share the same execution environment.
This shared context is what makes Pods special, and it includes:
Shared Networking Each Pod gets a unique IP address. All containers within that Pod share this IP and port space, allowing them to communicate with each other over localhost.
Shared Storage Containers in a Pod can share storage volumes, providing a common filesystem for data exchange and persistence.
The Pod Lifecycle A Pod progresses through several lifecycle phases:
Pending: The Pod has been accepted by the Kubernetes system, but one or more container images have not yet been created. This could be due to image download delays or the scheduler finding a suitable node.
Running: The Pod is bound to a node, and all containers are created. At least one container is running or is in the process of starting or restarting.
Succeeded: All containers have terminated successfully (exit status 0) and will not restart. This phase is typical for batch jobs.
Failed: All containers have terminated, and at least one container failed (non-zero exit code).
Unknown: The Pod state cannot be determined—often due to a network issue with the node.
Kubernetes Pods Overview In Kubernetes, Pods are represented as circles in diagrams, with cube-like structures as containers and cylinder-like structures as shared volumes.
A Pod can contain one or more containers, all sharing:
The same IP address
Storage volumes
Network resources
Other required configurations
Pods make it easier to move containers around the cluster. They are managed by controllers, which handle:
Rollouts: Deploying new versions of Pods
Replication: Maintaining the desired number of Pods
Health monitoring: Restarting or replacing failed Pods
If a node fails, Kubernetes controllers automatically recreate the affected Pods on another node to maintain availability.
Common Controllers Jobs → For batch tasks that run once and complete (ephemeral workloads).
Deployments → For stateless or persistent apps (like web services).
StatefulSets → For stateful, persistent apps (like databases).
Pod Operating System The operating system inside a Pod depends on the container image it uses. For example:
An Ubuntu-based image → Ubuntu OS inside the Pod
An Alpine Linux image → Alpine Linux OS inside the Pod
The choice of base image depends on the application’s requirements and the developer’s preference.
Pods and Controllers Pods are ephemeral — they don’t get rescheduled once they expire. Therefore, we generally don’t create Pods directly. Instead, we use higher-level objects that manage Pods automatically, such as:
Deployments
Replication Controllers
ReplicaSets
These controllers maintain Pod replicas and ensure high availability.
Getting Started with Kubernetes Pods
- Create a Pod Imperatively A quick way to test your cluster setup is by creating a simple Nginx Pod:
kubectl run nginx –image=nginx This command creates a Pod named nginx using the official Nginx image.
- Generate a Declarative Manifest Instead of writing YAML manually, you can generate it using kubectl:
kubectl run nginx –image=nginx –dry-run=client -o yaml > pod.yaml The –dry-run=client -o yaml flags generate YAML output without actually creating the Pod.
Your pod.yaml will look like this:
apiVersion: v1 kind: Pod metadata: creationTimestamp: null labels: run: nginx name: nginx spec: containers:
- image: nginx name: nginx resources: {} dnsPolicy: ClusterFirst restartPolicy: Always status: {} Key Fields:
apiVersion: API version (e.g., v1)
kind: Type of object (Pod)
metadata: Object identifiers such as name and labels
spec: Desired configuration — containers, images, ports, etc.
- Create a Pod Declaratively First, delete the Pod created imperatively:
kubectl delete pod nginx Now, create it from the YAML manifest:
kubectl apply -f pod.yaml Running kubectl apply again after modifying the YAML intelligently updates the Pod to match the new desired state.
Inspecting and Interacting with Your Pod Get Pod Status kubectl get pods Example output:
NAME READY STATUS RESTARTS AGE nginx 1/1 Running 0 60s Describe the Pod For detailed status, events, and configuration:
kubectl describe pod nginx View Container Logs kubectl logs nginx Execute Commands Inside a Container To open an interactive shell inside the container:
kubectl exec -it nginx – bash Once inside, use standard Linux commands (ls, cat, ps, etc.) to inspect the container.
Advanced Patterns: Multi-Container Pods Pods can include multiple containers that work closely together. Two common design patterns are:
Init Containers Init Containers run before the main application containers and must complete successfully before the main app starts.
Use Cases:
Waiting for a dependent service (e.g., database)
Running setup or migration scripts
Cloning a Git repository into a shared volume
Registering the Pod with a central service
Sidecar Containers Sidecars run alongside the main application containers throughout the Pod’s lifecycle. They extend or enhance the main app’s functionality.
Use Cases:
Logging: Collect and forward logs
Monitoring: Gather metrics for Prometheus
Service Mesh Proxy: Handle traffic via Istio or Linkerd
Data Sync: Sync files from S3 or Git
Pod Communication Internal Communication Containers in the same Pod communicate via localhost.
Inter-Pod Communication Pods within the same cluster communicate using cluster-private IPs assigned by Kubernetes networking.
If external access is required, you can expose a Pod using a Service.
Updating and Replacing Pods Kubernetes manages Pod updates gracefully:
Updating Pods: Makes configuration or image changes while keeping services running (rolling updates).
Pod Replacement: When a Pod crashes or is terminated, Kubernetes automatically recreates a new Pod instance — ensuring continuous availability.
Static Pods Static Pods are created directly by the kubelet on a node — not by the Kubernetes control plane.
You define them by placing a Pod manifest file in /etc/kubernetes/manifests/. The kubelet automatically starts and monitors the Pod on that node.
Static Pods are commonly used for control plane components like kube-apiserver, kube-scheduler, and etcd.
Basic Kubectl Commands for Kubernetes Pods Create a Pod kubectl create -f For example, to create a Pod named AskTech:
kubectl create -f asktech-pod.yaml Delete a Pod kubectl delete -f This deletes the Pod defined in the file.
Get Pods kubectl get pod –namespace Lists Pods within a specified namespace.
Troubleshooting with kubectl kubectl get pods → List all Pods in the current namespace.
kubectl describe pod → Get detailed Pod info.
kubectl logs → Retrieve logs from a specific Pod.
✅ In Summary: Kubernetes Pods are the fundamental execution unit in your cluster, enabling efficient container orchestration, networking, and storage sharing. While you can create Pods manually, managing them via higher-level controllers like Deployments or StatefulSets ensures reliability, scalability, and resilience for your workloads.