Multi-Container Pods: Sidecar, Init, and Ambassador Patterns
Pods can contain multiple containers that work together. Understanding these patterns is essential for CKAD.
Why Multi-Container Pods?
- Share network namespace (localhost communication)
- Share storage volumes
- Coordinate lifecycle
- Separation of concerns
Init Containers
Run before main containers start. Must complete successfully.
Use Cases
- Wait for dependencies
- Setup configuration
- Download assets
apiVersion: v1
kind: Pod
metadata:
name: init-demo
spec:
initContainers:
- name: wait-for-db
image: busybox
command: ['sh', '-c', 'until nc -z db-service 5432; do sleep 2; done']
- name: download-config
image: busybox
command: ['wget', '-O', '/config/app.conf', 'http://config-service/app.conf']
volumeMounts:
- name: config
mountPath: /config
containers:
- name: app
image: my-app
volumeMounts:
- name: config
mountPath: /etc/app
volumes:
- name: config
emptyDir: {}Sidecar Pattern
Helper container runs alongside main container.
Use Cases
- Log shipping
- Metrics collection
- Proxy/service mesh
apiVersion: v1
kind: Pod
metadata:
name: sidecar-demo
spec:
containers:
- name: app
image: my-app
volumeMounts:
- name: logs
mountPath: /var/log/app
- name: log-shipper
image: fluentd
volumeMounts:
- name: logs
mountPath: /var/log/app
volumes:
- name: logs
emptyDir: {}Ambassador Pattern
Proxy container handles external communication.
Use Cases
- Database connection pooling
- External service proxy
- Rate limiting
apiVersion: v1
kind: Pod
metadata:
name: ambassador-demo
spec:
containers:
- name: app
image: my-app
env:
- name: DB_HOST
value: "localhost" # Talks to ambassador
- name: db-ambassador
image: haproxy
ports:
- containerPort: 5432Adapter Pattern
Transform data format between application and external systems.
spec:
containers:
- name: app
image: legacy-app
volumeMounts:
- name: logs
mountPath: /var/log
- name: adapter
image: log-adapter
volumeMounts:
- name: logs
mountPath: /var/logContainer Communication
# Containers share localhost
# Container 1 listens on :8080
# Container 2 can access via localhost:8080Shared Volumes
volumes:
- name: shared-data
emptyDir: {}
# All containers can mount and accessExam Tips
- Init containers run sequentially
- Sidecar containers run in parallel
- Use emptyDir for shared storage
- Containers share network namespace
Practice Multi-Container Pods
These patterns appear frequently in CKAD exams. Practice at Sailor.sh.