强制终止Sidecar容器并忽略容器退出码
当您采用Sidecar容器的形式实现类似DaemonSet的效果时,可能会出现Job类Pod无法运行完成的情况,此时可以通过设置环境变量的方式,为Sidecar容器标记容器类型,并设置忽略Sidecar容器的退出码,以保证Job可以正常运行完成。
功能说明
在BCI场景下,由于虚拟节点的限制,BCI不支持Kubernetes的DaemonSet功能。此时部分需要使用DaemonSet的场景可以采用为BCI Pod添加Sidecar容器的形式来实现类似效果,但该方式在RestartPolicy配置为OnFailure和Never时,会影响BCI Pod的生命周期。例如:运行Job类任务时,为Job添加Filebeat Sidecar容器后,由于业务容器退出后,Filebeat容器会继续运行,会导致Job始终无法达到终态,无法运行完成。
针对上述场景,BCI支持通过Annotation指定需要忽略状态码的Sidecar容器列表:
-
忽略容器退出码
当业务容器正常退出后,由于BCI强制终止Sidecar容器的运行时,Sidecar容器的退出码为非0(非0表示容器运行失败终止),会导致Job最终的状态为Failed,此时可以通过设置Annotation的方式,标记Sidecar容器忽略容器退出码,强制将该容器置为运行成功终止状态,保证Job最终的状态为Succeeded。
配置说明
为BCI Pod设置以下Annotation来标记忽略退出码的Sidecar容器列表,容器名称之间用半角逗号隔开:
bci.virtual-kubelet.io/bci-ignore-exit-code-containers: "sidecar1,sidecar2"
重要
- Annotation请添加在Pod的metadata下,例如:创建Deployment时,Annotation需添加在spec>template>metadata下。
- 仅支持在创建BCI Pod时添加BCI相关Annotation来生效BCI功能,更新BCI Pod时添加或者修改BCI相关Annotation均不会生效。
配置示例
-
编写Job的YAML配置文件,然后使用该YAML文件创建Job
kubectl apply -f test-sidecar-job.yaml
test-sidecar-job.yaml的内容示例如下,表示创建一个Job,Job内包含两个容器,c1为业务容器,c2为Sidecar容器,并且添加了Annotation声明忽略Sidecar容器退出码。
apiVersion: batch/v1 kind: Job metadata: labels: app: test name: test namespace: default spec: template: metadata: annotations: bci.virtual-kubelet.io/bci-ignore-exit-code-containers: "c2" labels: app: test name: test spec: containers: - name: c1 image: registry.baidubce.com/glen-centos/centos:centos6 command: ["control.sh", "start"] imagePullPolicy: Always resources: limits: cpu: 1 memory: 2Gi - name: c2 image: registry.baidubce.com/glen-centos/centos:centos6 imagePullPolicy: Always command: ["/bin/sh", "-c", "sleep 120"] resources: limits: cpu: 250m memory: 512Mi nodeSelector: type: virtual-kubelet restartPolicy: Never tolerations: - effect: NoSchedule key: virtual-kubelet.io/provider operator: Equal value: baidu
-
查看Job详情和对应的Pod详情,观察效果
-
确认Job已经运行完成,且状态为Succeeded
kubectl describe job <job-name>
示例如下:
-
查看Sidecar容器详情,确认实际的退出码和相关信息
kubectl describe pod <pod-name>
示例如下:
-