全部產品
Search
文件中心

Elastic Container Instance:強制終止Sidecar容器並忽略容器退出碼

更新時間:May 26, 2026

當您採用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

取值說明如下:

  • normal:表示容器類型為普通容器。沒有設定該環境變數時,預設為normal。

  • sidecar:表示容器類型為Sidecar容器。

忽略容器退出碼

ECI_CONTAINER_IGNORE_EXIT_CODE

取值為true時,表示忽略容器退出碼。設定了該環境變數的容器運行終止時,如果退出碼為非0,ECI會強制將該容器置為運行成功終止狀態,並將實際的退出碼、失敗原因、失敗資訊以文本形式補充到Message欄位中。

配置樣本

  1. 編寫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
  2. 查看Job詳情和對應的Pod詳情,觀察環境變數的效果。

    • 確認Job已經運行完成,且狀態為Succeeded。

      kubectl describe job <job-name>

      樣本如下:

      :~$ kubectl describe job test
      Name:           test
      Namespace:      default
      Selector:       batch.kubernetes.io/controller-uid=c8a69ddd-34db-4716-
      Labels:         alibabacloud.com/eci=true
                      app=test
                      batch.kubernetes.io/controller-uid=c8a69ddd-34db-4716-
                      batch.kubernetes.io/job-name=test
                      controller-uid=c8a69ddd-34db-4716-8be4-528e556a8533
                      job-name=test
      Annotations:    <none>
      Parallelism:    1
      Completions:    1
      Completion Mode:    NonIndexed
      Start Time:     Wed, 29 Nov 2023 08:58:40 +0000
      Completed At:   Wed, 29 Nov 2023 08:59:37 +0000
      Duration:       57s
      Pods Statuses:  0 Active (0 Ready) / 1 Succeeded / 0 Failed
    • 查看Sidecar容器詳情,確認實際的退出碼和相關資訊。

      kubectl describe pod <pod-name>

      樣本如下:

      c2:
          Container ID:   containerd://970f2424854aa19796e7883026435de2dae4ecf
          Image:          registry.cn-shanghai.aliyuncs.com/eci_open/perl:5
          Image ID:       registry.cn-shanghai.aliyuncs.com/eci_open/perl@sha2
          Port:           <none>
          Host Port:      <none>
          Command:
            /bin/sh
            -c
            sleep 999
          State:          Terminated
            Reason:       Completed
            Message:      Force this container to be success(137, Error, )
            Exit Code:    0