當您採用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>樣本如下:
Parallelism: 1 Completions: 1 Completion Mode: NonIndexed Start Time: Tue, 29 Oct 2024 11:24:18 +0800 Completed At: Tue, 29 Oct 2024 11:25:17 +0800 Duration: 59s Pods Statuses: 0 Active (0 Ready) / 1 Succeeded / 0 Failed Pod Template:
-
-
查看Sidecar容器詳情,觀察容器的啟動順序和實際的退出碼
kubectl describe pod <pod-name>-
容器的啟動順序樣本如下,可以看到sidecar容器先於app容器啟動, 從而保證應用主容器依賴的sidecar功能(例如流量轉寄)提前就緒;另外,可以看到app容器運行結束後(10s後),sidecar容器會被強制殺掉,從而保證作業Pod可以完成:
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 5m11s default-scheduler Successfully assigned default/test-729nd to virtual-kubelet-cn-shenzhen-f Normal Pulling 5m13s kubelet Pulling image "registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28" Normal Pulled 5m12s kubelet Successfully pulled image "registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28" in 384ms Normal Created 5m12s kubelet Created container sidecar Normal Started 5m12s kubelet Started container sidecar Normal Pulling 5m12s kubelet Pulling image "registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28" Normal Pulled 5m12s kubelet Successfully pulled image "registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28" in 342ms Normal Created 5m12s kubelet Created container app Normal Started 5m12s kubelet Started container app Normal Killing 5m1s kubelet Stopping container sidecar -
退出碼樣本如下,可以看到sidecar容器被強制退出,且退出碼是0,保證不會干擾作業Pod運行是成功還是失敗的判斷。
sidecar: Container ID: containerd://bd85de5ad7ee1cb5a4807b094f2d41fa90881916857172 0e73ef0dfbd26f1dfb Image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28 Image ID: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox@sha256:141c253bc4c3fd0a20 Port: <none> Host Port: <none> Command: sh -c touch /var/logs.txt && tail -F /var/logs.txt State: Terminated Reason: Completed Message: Force this container to be success(137, Error, ) Exit Code: 0 Started: Tue, 29 Oct 2024 11:24:32 +0800 Finished: Tue, 29 Oct 2024 11:25:13 +0800 Ready: False Restart Count: 0
-