當您采用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方式將Sidecar容器作為一個特殊的Init容器來實現。Pod啟動時,應用容器需要等待Sidecar容器完成啟動之后才可以正常運行。同時
restartPolicy: Always
的配置使得Sidecar容器可以啟動、停止和重新啟動,且不會影響主應用容器和其他Init容器。ACS定制聲明
對于K8s 1.28及以下的版本, ACS支持為普通容器設置一個特殊的環境變量
__IS_SIDECAR__
,來標記此容器是否為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運行是成功還是失敗的判斷。