Pods Deep Dive
[!NOTE] This module explores the core principles of Pods Deep Dive, deriving solutions from first principles and hardware constraints to build world-class, production-ready expertise.
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
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']