当您采用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>
示例如下: