DAY5 介紹過 Pod 可以包含一個或多個容器。一般情況下,一個 Pod 只需要執行主要的應用程式;有時也會需要另一個容器,在旁邊協助應用程式工作,這種設計稱為 Sidecar Pattern(邊車模式)。
Sidecar 容器與主要應用程式容器位於同一個 Pod,可以共用網路空間,也能透過 Volume 共用檔案。常見用途包括收集日誌、代理網路流量,以及提供監控或其他輔助功能。
例如,主要容器將日誌寫入檔案,Sidecar 容器讀取同一個檔案,再將內容輸出到自己的標準輸出,方便使用 kubectl logs 查看。
Pod 可以在 containers 中設定多個容器。這些容器會一起啟動,適合彼此需要協同運作,但不要求特定啟動順序的情況。
不過,有些輔助容器需要先於主程式啟動,並在主程式結束後才停止。Kubernetes 現在也支援原生 Sidecar 容器:在 initContainers 中設定容器,並指定:
restartPolicy: Always
這類 Sidecar 會持續執行,不會像一般 Init Container 一樣在完成工作後結束。Kubernetes 1.29 起預設啟用這項功能,並自 Kubernetes 1.33 起成為穩定功能。
以下建立一個 Deployment,包含主要應用程式和 Sidecar:
app:每隔 5 秒將一行文字寫入日誌檔。log-sidecar:讀取同一個日誌檔,並將內容輸出。emptyDir:讓兩個容器共用日誌檔案。apiVersion: apps/v1
kind: Deployment
metadata:
name: sidecar-demo
spec:
replicas: 1
selector:
matchLabels:
app: sidecar-demo
template:
metadata:
labels:
app: sidecar-demo
spec:
initContainers:
- name: log-sidecar
image: busybox:1.36
restartPolicy: Always
command:
- sh
- -c
- touch /var/log/app/app.log && tail -F /var/log/app/app.log
volumeMounts:
- name: app-logs
mountPath: /var/log/app
containers:
- name: app
image: busybox:1.36
command:
- sh
- -c
- while true; do echo "$(date) app is running" >> /var/log/app/app.log; sleep 5; done
volumeMounts:
- name: app-logs
mountPath: /var/log/app
volumes:
- name: app-logs
emptyDir: {}
套用設定後,確認Pod狀態:
kubectl get pods -l app=sidecar-demo

Pod 名稱會由 Kubernetes 自動產生。先取得 Pod 名稱,再查看 Sidecar 容器輸出的日誌:
kubectl logs <Pod名稱> -c log-sidecar

應該會看到 app is running 以及時間資訊。主要容器將文字寫入共用 Volume 後,Sidecar 就能讀取並輸出這些內容。
註:如果叢集版本不支援原生 Sidecar 容器,initContainers 中的 restartPolicy: Always 可能無法使用。可以先用 kubectl version 確認叢集版本;較舊的叢集也能將輔助容器直接放在 containers 中,但容器啟動與結束的管理方式不同。
Sidecar 和主要應用程式位於同一個 Pod,因此會共用 Pod 的網路空間,並且可以掛載相同的 Volume。兩個容器可以透過 localhost 通訊,也可以透過共用檔案交換資料。
但它們仍是不同的容器,有各自的映像檔、程序和容器設定。加入 Sidecar 也會增加 Pod 的資源使用量,因此應一併考量 CPU、記憶體和儲存空間。
Sidecar Pattern 是在同一個 Pod 中,讓輔助容器與主要應用程式共同運作的設計方式。透過共用網路或 Volume,Sidecar 可以協助處理日誌、代理或監控等工作。若需要控制輔助容器的啟動與結束順序,可以使用 Kubernetes 原生 Sidecar 容器,在 initContainers 中設定 restartPolicy: Always。