Pods Deep Dive
Welcome to the Pods Deep Dive chapter. This section covers fundamental concepts and best practices necessary to master this topic in depth.
1. Why not just run Containers?
Docker runs Containers. Kubernetes runs Pods. A Pod represents a single instance of a running process in your cluster.
Key Characteristics
- Shared Network: All containers in a Pod share the same IP and Port space. They can talk via
localhost. - Shared Storage: Containers can mount the same Volumes to share data.
- Co-scheduling: Containers in a Pod are always scheduled on the same Node.
2. The “Pause” Container
Every Pod has a hidden container called the Pause Container (or data container).
- Role: It holds the Network Namespace and IPC Namespace open.
- Effect: Even if your main application container crashes and restarts, the Pod’s IP address remains the same because the Pause container stays alive.
3. Multi-Container Patterns
1. Sidecar
A helper container that enhances the main container.
- Example: Log shipper (Fluentd) reading logs from the main app and sending to S3.
- Example: Service Mesh Proxy (Envoy) handling traffic.
2. InitContainer
Runs before the main containers start.
- Use Case: Waiting for a Database to be ready.
- Use Case: Migrating DB schema.
- Success: Must exit with code
0. If it fails, the Pod restarts.
4. Interactive: Pod Lifecycle Visualizer
See how a Pod transitions through states.
Pod Status: Pending
Pending
→
Init
→
Running
→
Succeeded/Failed
5. Code Example: Pod Manifest
YAML
JSON
apiVersion: v1
kind: Pod
metadata:
name: my-app
labels:
app: backend
spec:
# Init Container
initContainers:
- name: init-db
image: busybox
command: ['sh', '-c', 'echo Waiting for DB...; sleep 2']
# Main Container
containers:
- name: server
image: nginx:latest
ports:
- containerPort: 80
# Sidecar Container
- name: log-agent
image: busybox
command: ['sh', '-c', 'while true; do echo Logging...; sleep 5; done']
{
"apiVersion": "v1",
"kind": "Pod",
"metadata": {
"name": "my-app",
"labels": { "app": "backend" }
},
"spec": {
"containers": [
{
"name": "server",
"image": "nginx:latest",
"ports": [{ "containerPort": 80 }]
}
]
}
}