忽略Sidecar容器的NotReady状态

阿里云容器计算服务ACS支持采用Sidecar容器的形式实现类似DaemonSet的效果。如果Sidecar容器的状态为NotReady,会导致Pod状态为NotReady。 如果您不希望Sidecar容器的状态影响整个Pod状态,可以通过环境变量的方式,设置忽略Sidecar容器的NotReady状态,保证Pod状态不受Sidecar容器状态的影响。

功能说明

在ACS场景下,由于虚拟节点的限制,不支持Kubernetes的DaemonSet功能。此时部分需要使用DaemonSet的场景可以采用为ACS Pod添加Sidecar容器的形式来实现类似效果。但添加Sidecar容器后,如果Sidecar容器的状态为NotReady,会导致Pod状态为NotReady。

在某些场景下,您可能会不希望Sidecar容器状态影响整个Pod状态,例如:使用Sidecar容器用于收集日志,但日志容器出现问题,不应该影响业务容器对外提供服务。

针对上述场景,ACS支持了忽略容器NotReady状态的功能。如果您不希望某一容器的状态影响整个Pod状态,可以为其添加忽略容器状态的环境变量。添加后,当该容器出现NotReady状态时,也不会影响Pod进入Ready状态。

配置说明

忽略容器状态的环境变量名为__IGNORE_READY__,取值为true时则表示忽略该容器状态。

配置示例

  1. 编写应用的YAML配置文件,然后使用该YAML文件创建Deployment。

    kubectl apply -f test-ignore.yaml

    test-ignore.yaml的内容示例如下,表示创建一个包含1个Pod副本的Deployment。Pod内包含两个容器,app容器可以正常运行,sidecar容器在命令里以非0码退出, 因此永远也无法进入Ready状态。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: test-ignore
      labels:
        app: test
    spec:
      replicas: 1 
      selector:
        matchLabels:
          app: test
      template:
        metadata:
          labels:
            app: test
        spec:
          containers:
          - name: app
            image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28
            command: ["/bin/sh", "-c", "sleep 999"] 
          - name: sidecar
            image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28
            command: ["/bin/sh", "-c", "exit 1"] 
            env:
            - name: __IGNORE_READY__
              value: "true"
  2. 查看Pod的详细信息,确认容器状态。

    kubectk get pod <pod-name> -o yaml

    预期输出:

    ...
    status:
      conditions:
        - lastTransitionTime: '2024-08-02T09:36:14Z'
          status: 'True'
          type: Initialized
        - lastTransitionTime: '2024-08-02T09:36:16Z'
          status: 'True'
          type: Ready
        - lastTransitionTime: '2024-08-02T09:36:16Z'
          status: 'True'
          type: ContainersReady
        - lastTransitionTime: '2024-08-02T09:36:15Z'
          status: 'True'
          type: PodScheduled
        - lastTransitionTime: '2024-08-02T09:36:14Z'
          status: 'True'
          type: ContainerHasSufficientDisk
    ...

    在返回信息的status conditions中确认Ready和ContainersReady字段,可以看到两者的status均为True,表示已经忽略了sidecar容器的NotReady状态。