當您採用Sidecar容器的形式實作類別似DaemonSet的效果,從而提供額外的服務或功能(如日誌記錄、監控、安全性或流量轉寄),這些功能需要控制Sidecar容器相對於主應用程式容器的啟停順序。本文介紹如何配置Sidecar容器啟停順序。
功能說明
在ACS情境下,由於虛擬節點的限制,不支援Kubernetes的DaemonSet功能。此時部分需要使用DaemonSet的情境可以採用為Pod添加Sidecar容器的形式來實作類別似效果。 然而,Sidecar容器的生命週期無法獨立於Pod的生命週期。為了達到類似於DaemonSet的效果,您需要進行一些配置來控制Sidecar容器的啟停順序。保證Sidecar容器在Pod建立時先於應用主容器啟動, 並保證在Job類Pod中業務容器已經退出的情況下, 強制終止Sidecar容器。
針對上述情境,ACS支援通過兩種方式配置Sidecar容器的啟停順序:
社區原生Sidecar聲明
在K8s 1.29及以上的版本, 預設支援原生的Sidecar聲明方式。 即通過把Sidecar配置為Init容器,並將
restartPolicy設定成Always。說明原生Sidecar方式將Sidecar容器作為一個特殊的Init容器來實現。Pod啟動時,應用程式容器需要等待Sidecar容器完成啟動之後才可以正常運行。同時
restartPolicy: Always的配置使得Sidecar容器可以啟動、停止和重新啟動,且不會影響主應用程式容器和其他Init容器。ACS定製聲明
對於K8s 1.28及以下的版本, ACS支援為普通容器設定一個特殊的環境變數
__IS_SIDECAR__,來標記此容器是否為Sidecar。重要ACS定製聲明的方式,支援將普通容器聲明為Sidecar,先於其他普通容器啟動,並按
restartPolicy為Always的原則自動重試。同時,ACS叢集在低版本K8s(1.28及以下)做了相容,確保Container狀態可以得到更新。但在高版本或其他類型的的K8s叢集中,受限於K8s對於Container狀態的更新限制,ACS定製聲明的Sidecar容器在失敗重試後,
containerStatus和Pod狀態中並不會更新為Running,請以Pod實際狀態為準。建議您將叢集升級至1.29以上版本,並使用社區原生Sidecar聲明的方式。
配置說明
配置方法 | Pod欄位/環境變數名稱 | 配置說明 |
社區原生Sidecar聲明 | Init容器的 |
|
ACS定製聲明 | 普通容器的環境變數: |
|
配置樣本
test-sidecar.yaml的內容樣本如下,表示建立一個Job,Job內包含兩個容器,app為業務容器,sidecar為Sidecar容器。
ACS定製聲明
apiVersion: batch/v1 kind: Job metadata: name: test spec: template: metadata: labels: app: test spec: containers: - name: app image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28 command: ['sh', '-c', 'for i in $(seq 1 10);do echo "logging" >> /var/logs.txt; sleep 1; done'] - name: sidecar image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28 command: ['sh', '-c', 'touch /var/logs.txt && tail -F /var/logs.txt'] env: - name: __IS_SIDECAR__ # 為此容器設定環境變數 value: "true" # 標記此容器為sidecar restartPolicy: Never backoffLimit: 2社區原生Sidecar聲明
apiVersion: batch/v1 kind: Job metadata: name: test spec: template: metadata: labels: app: test spec: initContainers: - name: sidecar image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28 command: ['sh', '-c', 'touch /var/logs.txt && tail -F /var/logs.txt'] restartPolicy: Always # 聲明此容器為sidecar containers: - name: app image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28 command: ['sh', '-c', 'for i in $(seq 1 10);do echo "logging" >> /var/logs.txt; sleep 1; done'] restartPolicy: Never backoffLimit: 2執行以下命令,建立Job。
kubectl apply -f test-sidecar.yaml查看Job詳情和對應的Pod詳情,觀察環境變數的效果。
確認Job已經運行完成,且狀態為
Succeeded。kubectl describe job <job-name>樣本如下:

查看Sidecar容器詳情,觀察容器的啟動順序和實際的退出碼
kubectl describe pod <pod-name>容器的啟動順序樣本如下,可以看到sidecar容器先於app容器啟動, 從而保證應用主容器依賴的sidecar功能(例如流量轉寄)提前就緒;另外,可以看到app容器運行結束後(10s後),sidecar容器會被強制殺掉,從而保證作業Pod可以完成:

退出碼樣本如下,可以看到sidecar容器被強制退出,且退出碼是0,保證不會干擾作業Pod運行是成功還是失敗的判斷。
