當您采用Sidecar容器的形式實現類似DaemonSet的效果時,可能會出現Job類Pod無法運行完成的情況,此時可以通過設置環境變量的方式,為Sidecar容器標記容器類型,并設置忽略Sidecar容器的退出碼,以保證Job可以正常運行完成。
功能說明
在ACK Serverless集群+ECI場景下,由于虛擬節點的限制,ECI不支持Kubernetes的DaemonSet功能。此時部分需要使用DaemonSet的場景可以采用為ECI Pod添加Sidecar容器的形式來實現類似效果,但該方式在RestartPolicy配置為OnFailure和Never時,會影響ECI Pod的生命周期。例如:運行Job類任務時,為Job添加Filebeat Sidecar容器后,由于業務容器退出后,Filebeat容器會繼續運行,會導致Job始終無法達到終態,無法運行完成。
針對上述場景,ECI支持了以下兩個功能:
聲明容器類型
通過設置容器環境變量的方式,為Sidecar容器添加類型標記,可以實現在業務容器已退出且不會重啟的情況下,ECI強制終止Sidecar容器的運行,保證Job可以運行完成。
忽略容器退出碼
由于ECI強制終止Sidecar容器的運行時,Sidecar容器的退出碼為非0(非0表示容器運行失敗終止),會導致Job最終的狀態為Failed,此時可以通過設置容器環境變量的方式,標記Sidecar容器忽略容器退出碼,強制將該容器置為運行成功終止狀態,保證Job最終的狀態為Succeeded。
配置說明
配置項 | 環境變量名稱 | 配置說明 |
聲明容器類型 | ECI_CONTAINER_TYPE | 取值說明如下:
|
忽略容器退出碼 | ECI_CONTAINER_IGNORE_EXIT_CODE | 取值為true時,表示忽略容器退出碼。設置了該環境變量的容器運行終止時,如果退出碼為非0,ECI會強制將該容器置為運行成功終止狀態,并將實際的退出碼、失敗原因、失敗信息以文本形式補充到Message字段中。 |
配置示例
編寫Job的YAML配置文件,然后使用該YAML文件創建Job。
kubectl apply -f test-sidecar.yaml
test-sidecar.yaml的內容示例如下,表示創建一個Job,Job內包含兩個容器,c1為業務容器,c2為Sidecar容器,并且添加了環境變量聲明容器類型,和忽略容器退出碼。
apiVersion: batch/v1 kind: Job metadata: name: test spec: template: metadata: labels: app: test alibabacloud.com/eci: "true" spec: containers: - name: c1 image: registry.cn-shanghai.aliyuncs.com/eci_open/perl:5 command: ["perl","-Mbignum=bpi","-wle","print bpi(2000)"] - name: c2 image: registry.cn-shanghai.aliyuncs.com/eci_open/perl:5 command: ["/bin/sh","-c","sleep 999"] env: - name: ECI_CONTAINER_TYPE value: "sidecar" - name: ECI_CONTAINER_IGNORE_EXIT_CODE value: "true" restartPolicy: Never backoffLimit: 2
查看Job詳情和對應的Pod詳情,觀察環境變量的效果。
確認Job已經運行完成,且狀態為Succeeded。
kubectl describe job <job-name>
示例如下:
查看Sidecar容器詳情,確認實際的退出碼和相關信息。
kubectl describe pod <pod-name>
示例如下: