强制终止Sidecar容器并忽略容器退出码
当您采用Sidecar容器的形式实现类似DaemonSet的效果时,可能会出现Job类Pod无法运行完成的情况,此时可以通过设置BCI Pod Annotation指定需要忽略容器退出码的容器,以保证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容器列表,容器名称之间用半角逗号隔开:
1bci.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
Plain Text1kubectl apply -f test-sidecar-job.yaml
test-sidecar-job.yaml的内容示例如下,表示创建一个Job,Job内包含两个容器,c1为业务容器,c2为Sidecar容器,并且添加了Annotation声明忽略Sidecar容器退出码。
YAML1apiVersion: batch/v1 2kind: Job 3metadata: 4 labels: 5 app: test 6 name: test 7 namespace: default 8spec: 9 template: 10 metadata: 11 annotations: 12 bci.virtual-kubelet.io/bci-ignore-exit-code-containers: "c2" 13 labels: 14 app: test 15 name: test 16 spec: 17 containers: 18 - name: c1 19 image: registry.baidubce.com/glen-centos/centos:centos6 20 command: ["control.sh", "start"] 21 imagePullPolicy: Always 22 resources: 23 limits: 24 cpu: 1 25 memory: 2Gi 26 - name: c2 27 image: registry.baidubce.com/glen-centos/centos:centos6 28 imagePullPolicy: Always 29 command: ["/bin/sh", "-c", "sleep 120"] 30 resources: 31 limits: 32 cpu: 250m 33 memory: 512Mi 34 nodeSelector: 35 type: virtual-kubelet 36 restartPolicy: Never 37 tolerations: 38 - effect: NoSchedule 39 key: virtual-kubelet.io/provider 40 operator: Equal 41 value: baidu
-
查看Job详情和对应的Pod详情,观察效果
-
确认Job已经运行完成,且状态为Succeeded
Bash1kubectl describe job <job-name>
示例如下:
-
查看Sidecar容器详情,确认实际的退出码和相关信息
Bash1kubectl describe pod <pod-name>
示例如下:
-