本文介绍如何通过环境变量的方式,为一个ECI实例内的各个容器设置启动和退出优先级,实现容器按顺序启动和退出。
功能说明
默认情况下,ECI实例内的各个容器是并发进行启动和退出的,没有固定的前后顺序。在某些场景下,一个实例内的多个容器之间可能存在依赖关系,某一容器需要在另一容器启动后再启动,或者某一容器需要在另一容器退出后再退出。例如:
istio服务治理场景,需要保证在业务容器产生流量时,istio-proxy容器已经Ready;在业务容器退出后,istio-proxy容器才退出。
采集日志时,需要保证在业务容器产生日志前,日志容器已经Ready;在业务容器退出后,日志容器才退出。
针对上述场景,ECI支持通过设置容器环境变量的方式,为ECI实例内的容器设置启动和退出优先级。您可以按照您的业务需求为容器添加相应的环境变量,来保证容器按顺序启动或按顺序退出。
配置说明
设置容器启动和退出顺序的环境变量如下:
配置项 | 环境变量名称 | 配置说明 |
容器启动优先级 | ECI_CONTAINER_LAUNCH_PRIORITY |
|
容器退出优先级 | ECI_CONTAINER_EXIT_PRIORITY |
|
通过OpenAPI创建ECI实例时,可以设置TerminationGracePeriodSeconds来保证实例优雅退出,此时如果设置了容器退出顺序,实例总体的销毁时间可能会大于TerminationGracePeriodSeconds声明的时间。
配置示例
设置容器启动顺序
API
创建一台设置了容器启动顺序的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" ] } ] }
查看实例详情,确认各个容器的启动时间。
调用DescribeContainerGroups查询实例详情,在返回信息的
Containers
中查看各个容器的详细信息,通过CurrentState.StartTime
字段,可以看出c2容器的启动时间晚于c1容器。
控制台
通过弹性容器实例控制台创建ECI实例时,您可以在各个容器的高级配置中设置环境变量,为容器设置启动优先级,同时在健康检查处可以设置Readiness Probe(即应用业务探针)。
创建完成后,您可以通过查看实例事件,确认各个容器的启动顺序。
设置容器退出顺序
API
创建一台设置了容器退出顺序的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" ] } ] }
删除实例,然后观察实例内容器Killing事件的顺序。
说明如果需要确认容器退出顺序,请及时查看事件,ECI实例彻底删除后可能无法观察到相关事件。
调用DescribeContainerGroupEvents查询实例事件,在返回信息的
Events
中查看各个容器Killing事件的时间,可以看出容器退出顺序依次为c1、c2、c3。
控制台
通过弹性容器实例控制台创建ECI实例时,您可以在各个容器的高级配置中设置环境变量,为容器设置退出优先级。