本文介绍如何通过环境变量的方式,为一个ECI实例(即ECI Pod)内的各个容器设置启动和退出优先级,实现容器按顺序启动和退出。
功能说明
默认情况下,ECI实例内的各个容器是并发进行启动和退出的,没有固定的前后顺序。在某些场景下,一个实例内的多个容器之间可能存在依赖关系,某一容器需要在另一容器启动后再启动,或者某一容器需要在另一容器退出后再退出。例如:
istio服务治理场景,需要保证在业务容器产生流量时,istio-proxy容器已经Ready;在业务容器退出后,istio-proxy容器才退出。
采集日志时,需要保证在业务容器产生日志前,日志容器已经Ready;在业务容器退出后,日志容器才退出。
针对上述场景,ECI支持通过设置容器环境变量的方式,为ECI实例内的容器设置启动和退出优先级。您可以按照您的业务需求为容器添加相应的环境变量,来保证容器按顺序启动或按顺序退出。
配置说明
设置容器启动和退出顺序的环境变量如下:
配置项 | 环境变量名称 | 配置说明 |
容器启动优先级 | ECI_CONTAINER_LAUNCH_PRIORITY |
|
容器退出优先级 | ECI_CONTAINER_EXIT_PRIORITY |
|
设置容器退出顺序后,Pod总体的销毁时间可能会大于Pod Spec中TerminationGracePeriodSeconds声明的时间。
配置示例
设置容器启动顺序
编写应用的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
观察Pod status中各个容器的启动时间。
kubectl describe pod <pod name>
从返回信息的
Containers
中,可以看出c2容器的启动时间晚于c1容器。示例如下:
设置容器退出顺序
编写应用的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
删除Pod,然后观察Pod内容器Killing事件的顺序。
说明如果需要确认容器退出顺序,请及时查看事件,Pod彻底删除后可能无法观察到相关事件。
kubectl describe pod <pod name>
从返回信息的
Events
中,可以看出容器退出顺序依次为c1、c2、c3。示例如下: