忽略Sidecar容器的NotReady状态
当您采用Sidecar容器的形式实现类似DaemonSet的效果时,如果Sidecar容器的状态为NotReady,会导致Pod状态为NotReady。某些场景下,如果您不希望Sidecar容器的状态影响整个Pod状态,可以通过设置BCI Pod Annotation,设置需要忽略的Sidecar容器的NotReady状态的容器列表,保证Pod状态不受Sidecar容器状态的影响。
功能说明
在BCI场景下,由于虚拟节点的限制,BCI不支持Kubernetes的DaemonSet功能。此时部分需要使用DaemonSet的场景可以采用为BCI Pod添加Sidecar容器的形式来实现类似效果。但添加Sidecar容器后,如果Sidecar容器的状态为NotReady,会导致Pod状态为NotReady。在某些场景下,您可能会不希望Sidecar容器状态影响整个Pod状态,例如:使用Sidecar容器用于收集日志,但日志容器出现问题,不应该影响业务容器对外提供服务。
针对上述场景,BCI支持了忽略容器NotReady状态的功能。如果您不希望某一容器的状态影响整个Pod状态,可以为其添加忽略容器状态的环境变量。添加后,当该容器出现NotReady状态时,也不会影响Pod进入Ready状态。
配置说明
为BCI Pod设置以下Annotation来标记忽略退出码的Sidecar容器列表,容器名称之间用半角逗号隔开:
bci.virtual-kubelet.io/bci-ignore-not-ready-containers: "sidecar1,sidecar2"
重要
- Annotation请添加在Pod的metadata下,例如:创建Deployment时,Annotation需添加在spec>template>metadata下。
- 仅支持在创建BCI Pod时添加BCI相关Annotation来生效BCI功能,更新BCI Pod时添加或者修改BCI相关Annotation均不会生效。
配置示例
-
编写Deployment的YAML配置文件,然后使用该YAML文件创建deployment
kubectl apply -f test-sidecar-ignore.yaml
test-sidecar-ignore.yaml的内容示例如下,表示创建一个deployment, 内包含两个容器,c1为业务容器,c2为Sidecar容器,并且添加了Annotation声明忽略Sidecar容器NotReady的状态。
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-ignore
labels:
app: test
spec:
replicas: 1
selector:
matchLabels:
app: test
template:
metadata:
labels:
app: test
annotations:
bci.virtual-kubelet.io/bci-ignore-not-ready-containers: "c2"
spec:
containers:
- name: c1
image: registry.baidubce.com/glen-centos/centos:centos6
command: ["/bin/sh", "-c", "sleep 999"]
- name: c2
image: registry.baidubce.com/glen-centos/centos:centos6
- name: c3
image: registry.baidubce.com/glen-centos/centos:centos6
nodeSelector:
type: virtual-kubelet
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
tolerations:
- effect: NoSchedule
key: virtual-kubelet.io/provider
operator: Equal
value: baidu
-
查看Deployment对应的Pod详情,查看Pod的Condition观察效果,可见ContainersReady和Ready类型的condition的状态均为True。
```bash kubectl get pod <pod-name> -o yaml ```
conditon示例如下: