设置容器启动和退出顺序

本文介绍如何通过环境变量的方式,为一个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 Spec中TerminationGracePeriodSeconds声明的时间。

配置示例

设置容器启动顺序

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

    kubectl apply -f test-launch.yaml

    test-launch.yaml的内容示例如下,表示创建一个包含1个Pod副本的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容器。示例如下:

    容器启动k8s.png

设置容器退出顺序

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

    kubectl apply -f test-exit.yaml

    test-exit.yaml的内容示例如下,表示创建一个包含1个Pod副本的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。示例如下:

    容器退出.png