强制终止Sidecar容器并忽略容器退出码

当您采用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>

      示例如下:

      job-1.png

    • 查看Sidecar容器详情,确认实际的退出码和相关信息。

      kubectl describe pod <pod-name>

      示例如下:

      job-2.png