全部产品
Search
文档中心

弹性容器实例:设置容器启动和退出顺序

更新时间:Aug 22, 2023

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

功能说明

默认情况下,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。数值越大,退出优先级越高。

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

重要

通过OpenAPI创建ECI实例时,可以设置TerminationGracePeriodSeconds来保证实例优雅退出,此时如果设置了容器退出顺序,实例总体的销毁时间可能会大于TerminationGracePeriodSeconds声明的时间。

配置示例

设置容器启动顺序

API

  1. 创建一台设置了容器启动顺序的ECI实例。

    调用CreateContainerGroup接口创建ECI实例所采用的参数示例如下,实例内包含两个容器,c1容器的启动优先级高于c2容器,且c1容器配置了Readiness Probe,c2容器会在c1容器准备就绪后才启动。

    {
      "RegionId": "cn-beijing",
      "SecurityGroupId": "sg-2ze63v3jtm8e6syi****",
      "VSwitchId": "vsw-2ze94pjtfuj9vaymf****",
      "ContainerGroupName": "test-launch",
      "Container": [
        {
          "Name": "c1",
          "Image": "registry.cn-shanghai.aliyuncs.com/eci_open/nginx:alpine",
          "EnvironmentVar": [
            {
              "Key": "ECI_CONTAINER_LAUNCH_PRIORITY",
              "Value": "1000"
            }
          ],
          "ReadinessProbe.PeriodSeconds": 3,
          "ReadinessProbe.HttpGet.Path": "/",
          "ReadinessProbe.HttpGet.Port": 80
        },
        {
          "Name": "c2",
          "Image": "registry.cn-shanghai.aliyuncs.com/eci_open/nginx:alpine",
          "EnvironmentVar": [
            {
              "Key": "ECI_CONTAINER_LAUNCH_PRIORITY",
              "Value": "0"
            }
          ],
          "Arg": [
            "/bin/sh",
            "-c",
            "sleep 3600s"
          ]
        }
      ]
    }
  2. 查看实例详情,确认各个容器的启动时间。

    调用DescribeContainerGroups查询实例详情,在返回信息的Containers中查看各个容器的详细信息,通过CurrentState.StartTime字段,可以看出c2容器的启动时间晚于c1容器。

控制台

通过弹性容器实例控制台创建ECI实例时,您可以在各个容器的高级配置中设置环境变量,为容器设置启动优先级,同时在健康检查处可以设置Readiness Probe(即应用业务探针)。

容器启动-控制台.png

创建完成后,您可以通过查看实例事件,确认各个容器的启动顺序。

设置容器退出顺序

API

  1. 创建一台设置了容器退出顺序的ECI实例。

    调用CreateContainerGroup接口创建ECI实例所采用的参数示例如下,实例设置了TerminationGracePeriodSeconds为30s,包含三个容器,容器退出优先级从高到低依次为c1、c2、c3。

    {
      "RegionId": "cn-beijing",
      "ContainerGroupName": "test-exit",
      "SecurityGroupId": "sg-2ze63v3jtm8e6syi****",
      "VSwitchId": "vsw-2ze94pjtfuj9vaymf****",
      "TerminationGracePeriodSeconds": 30,
      "Container": [
        {
          "Name": "c1",
          "Image": "registry.cn-shanghai.aliyuncs.com/eci_open/nginx:alpine",
          "EnvironmentVar": [
            {
              "Key": "ECI_CONTAINER_EXIT_PRIORITY",
              "Value": "1000"
            }
          ]
        },
        {
          "Name": "c2",
          "Image": "registry.cn-shanghai.aliyuncs.com/eci_open/nginx:alpine",
          "EnvironmentVar": [
            {
              "Key": "ECI_CONTAINER_EXIT_PRIORITY",
              "Value": "0"
            }
          ],
          "Arg": [
            "/bin/sh",
            "-c",
            "sleep 3600s"
          ]
        },
        {
          "Name": "c3",
          "Image": "registry.cn-shanghai.aliyuncs.com/eci_open/nginx:alpine",
          "EnvironmentVar": [
            {
              "Key": "ECI_CONTAINER_EXIT_PRIORITY",
              "Value": "-1000"
            }
          ],
          "Arg": [
            "/bin/sh",
            "-c",
            "sleep 3600s"
          ]
        }
      ]
    }
  2. 删除实例,然后观察实例内容器Killing事件的顺序。

    说明

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

    调用DescribeContainerGroupEvents查询实例事件,在返回信息的Events中查看各个容器Killing事件的时间,可以看出容器退出顺序依次为c1、c2、c3。

控制台

通过弹性容器实例控制台创建ECI实例时,您可以在各个容器的高级配置中设置环境变量,为容器设置退出优先级。

容器退出-控制台.png