设置容器启动和退出顺序

更新时间:
复制为 MD 格式

本文介绍如何通过环境变量的方式,为一个ECI实例(即ECI Pod)内的各个容器设置启动和退出优先级,实现容器按顺序启动和退出。

功能说明

默认情况下,ECI实例内的各个容器是并发进行启动和退出的,没有固定的前后顺序。在某些场景下,一个实例内的多个容器之间可能存在依赖关系,某一容器需要在另一容器启动后再启动,或者某一容器需要在另一容器退出后再退出。例如:

  • istio服务治理场景,需要保证在业务容器产生流量时,istio-proxy容器已经Ready;在业务容器退出后,istio-proxy容器才退出。

  • 采集日志时,需要保证在业务容器产生日志前,日志容器已经Ready;在业务容器退出后,日志容器才退出。

针对上述场景,ECI支持通过设置容器环境变量的方式,为ECI实例内的容器设置启动和退出优先级。您可以按照您的业务需求为容器添加相应的环境变量,来保证容器按顺序启动或按顺序退出。

配置说明

设置容器启动和退出顺序的环境变量如下:

配置项

环境变量名称

配置说明

容器启动优先级

ECI_CONTAINER_LAUNCH_PRIORITY

  • 取值范围为-1000~1000,默认值为0。数值越大,启动优先级越高。

  • 优先级高的容器保证会在优先级低的容器启动之前启动,相同优先级的容器不保证启动顺序(并发启动)。

  • 如果某容器依赖上一个容器提供服务,需要为容器配置Readiness Probe。例如:B容器依赖A容器提供服务,则在设置A容器的启动优先级高于B容器的同时,还需要为A容器配置Readiness Probe,确保A容器准备就绪后才启动B容器。

容器退出优先级

ECI_CONTAINER_EXIT_PRIORITY

  • 取值范围为-1000~1000,默认值为0。数值越大,退出优先级越高。

  • 优先级高的容器保证会在优先级低的容器退出之前退出,相同优先级的容器不保证退出顺序(并发退出)。

重要

设置容器退出顺序后,Pod总体的销毁时间可能会大于Pod SpecTerminationGracePeriodSeconds声明的时间。

配置示例

设置容器启动顺序

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

    kubectl apply -f test-launch.yaml

    test-launch.yaml的内容示例如下,表示创建一个包含1Pod副本的Deployment。Pod内包含两个容器,c1容器的启动优先级高于c2容器,且c1容器配置了Readiness Probe,c2容器会在c1容器准备就绪后才启动。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: test-launch
      labels:
        app: test
    spec:
      replicas: 1 
      selector:
        matchLabels:
          app: test
      template:
        metadata:
          labels:
            app: test
        spec:
          containers:
          - image: registry-vpc.cn-shanghai.aliyuncs.com/eci_open/nginx:alpine
            name: c1
            env:
            - name: ECI_CONTAINER_LAUNCH_PRIORITY
              value: "1000"
            readinessProbe:                  
              httpGet:
                path: /
                port: 80
              initialDelaySeconds: 30     
              periodSeconds: 3
          - image: registry-vpc.cn-shanghai.aliyuncs.com/eci_open/nginx:alpine
            name: c2
            env:
            - name: ECI_CONTAINER_LAUNCH_PRIORITY
              value: "0"
            args:
            - /bin/sh
            - -c
            - sleep 3600s
  2. 观察Pod status中各个容器的启动时间。

    kubectl describe pod <pod name>

    从返回信息的Containers中,可以看出c2容器的启动时间晚于c1容器。示例如下:

    Containers:
    c1:
        Container ID:   containerd://779ec5b6d9ad1164c929ab0b8bbc4a3a3b24fe1f9654867e842f2dcfe7b24beb
        Image:          registry.cn-shanghai.aliyuncs.com/eci_open/nginx:alpine
        Image ID:       registry.cn-shanghai.aliyuncs.com/eci_open/nginx@sha256:2ec3c026183996087f26c6b3
        Port:           <none>
        Host Port:      <none>
        State:          Running
          Started:      Wed, 16 Aug 2023 07:11:48 +0000
        Ready:          True
        Restart Count:  0
        Readiness:      http-get http://:80/ delay=30s timeout=1s period=3s #success=1 #failure=3
        Environment:
          ECI_CONTAINER_LAUNCH_PRIORITY:  1000
        Mounts:
          /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-2qkqp (ro)
    c2:
        Container ID:   containerd://fe6261cc2e659ee9afb07c2efd516250aeb854544504d66ac011b557e94a0cb6
        Image:          registry.cn-shanghai.aliyuncs.com/eci_open/nginx:alpine
        Image ID:       registry.cn-shanghai.aliyuncs.com/eci_open/nginx@sha256:2ec3c026183996087f26c6b38
        Port:           <none>
        Host Port:      <none>
        Args:
          /bin/sh
          -c
          sleep 3600s
        State:          Running
          Started:      Wed, 16 Aug 2023 07:12:20 +0000
        Ready:          True
        Restart Count:  0
        Environment:
          ECI_CONTAINER_LAUNCH_PRIORITY:  0

设置容器退出顺序

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

    kubectl apply -f test-exit.yaml

    test-exit.yaml的内容示例如下,表示创建一个包含1Pod副本的Deployment。Pod内包含三个容器,退出优先级从高到低依次为c1、c2、c3。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: test-exit
      labels:
        app: test
    spec:
      replicas: 1 
      selector:
        matchLabels:
          app: test
      template:
        metadata:
          labels:
            app: test
        spec:
          containers:
          - image: registry-vpc.cn-shanghai.aliyuncs.com/eci_open/nginx:alpine
            name: c1
            env:
            - name: ECI_CONTAINER_EXIT_PRIORITY
              value: "1000"
          - image: registry-vpc.cn-shanghai.aliyuncs.com/eci_open/nginx:alpine
            name: c2
            env:
            - name: ECI_CONTAINER_EXIT_PRIORITY
              value: "0"
            args:
            - /bin/sh
            - -c
            - sleep 3600s
          - image: registry-vpc.cn-shanghai.aliyuncs.com/eci_open/nginx:alpine
            name: c3
            env:
            - name: ECI_CONTAINER_EXIT_PRIORITY
              value: "-1000"
            args:
            - /bin/sh
            - -c
            - sleep 3600s
  2. 删除Pod,然后观察Pod内容器Killing事件的顺序。

    说明

    如果需要确认容器退出顺序,请及时查看事件,Pod彻底删除后可能无法观察到相关事件。

    kubectl describe pod <pod name>

    从返回信息的Events中,可以看出容器退出顺序依次为c1、c2、c3。示例如下:

    Events:
      Type     Reason                  Age    From               Message
      ----     ------                  ----   ----               -------
      Warning  MissingClusterDNS       2m10s  virtual-kubelet    pod: default/test-exit-pr
    and cannot create Pod using "ClusterFirst" policy. Falling back to "Default" policy.
      Normal   DefaultInstanceTypeMatch  2m10s  EciService       [eci.containergroup]The de
      Warning  ImageCacheMissed        2m9s   EciService         [eci.imagecache]Missed ima
      Normal   ImageCacheAutoCreated   2m9s   EciService         [eci.imagecache]Image cach
      Normal   Pulling                 115s   kubelet            Pulling image "registry.cn
      Normal   Pulled                  113s   kubelet            Successfully pulled image
    ing)
      Normal   Created                 113s   kubelet            Created container c1
      Normal   Started                 113s   kubelet            Started container c1
      Normal   Pulled                  113s   kubelet            Container image "registry.
      Normal   Created                 113s   kubelet            Created container c2
      Normal   Started                 113s   kubelet            Started container c2
      Normal   Pulled                  113s   kubelet            Container image "registry.
      Normal   Created                 112s   kubelet            Created container c3
      Normal   Started                 112s   kubelet            Started container c3
      Normal   Killing                 37s    kubelet            Stopping container c1
      Normal   Killing                 37s    kubelet            Stopping container c2
      Normal   Killing                 7s     kubelet            Stopping container c3