设置容器启动和退出顺序
设置容器启动和退出顺序
本文介绍如何通过环境变量的方式,为一个BCI实例 (即BCI Pod) 内的各个容器设置启动和退出优先级,实现容器按顺序启动和退出。
功能说明
默认情况下,BCI实例内各个容器是并发进行启动和退出的,没有固定的前后顺序。在某些场景下,一个实例内的多个容器之间可能存在依赖关系,如某个容器需要在另一容器启动后再启动,或者某一容器需要在另一容器退出后再退出。例如:
- istio服务治理场景,需要保证在业务容器产生流量时,istio-proxy容器已经Ready;在业务容器退出后,istio-proxy容器才退出。
- 采集日志时,需要保证在业务容器产生日志前,日志容器已经Ready;在业务容器退出后,日志容器才退出。
针对上述场景,BCI支持通过设置容器环境变量的方式,为BCI实例内的容器设置启动和退出优先级。您可以按照您的业务需求为容器添加相应的环境变量,来保证容器按顺序启动或按顺序退出。
配置说明
设置容器启动和退出的环境变量如下:
配置项 | 环境变量名称 | 配置说明 |
---|---|---|
容器启动优先级 | BCI_CONTAINER_LAUNCH_PRIORITY | |
容器退出优先级 | BCI_CONTAINER_EXIT_PRIORITY |
⚠️注意:设置容器退出顺序后,Pod总体的销毁时间可能会大于Pod Spec中TerminationGracePeriodSeconds声明的时间。
配置示例
设置容器启动顺序
-
编写应用的YAML配置文件,然后使用该YAML文件创建Deployment。
Plain Text1kubectl apply -f container-launch.yaml
container-launch.yaml的内容示例如下,表示创建一个包含1个Pod副本的Deployment。Pod包含两个容器,c2容器的优先级高于c1容器,且c2容器配置了Readiness Prob,c1容器会在c2容器准备就绪后才启动。
Plain Text1apiVersion: apps/v1 2kind: Deployment 3metadata: 4 name: test-app 5spec: 6 selector: 7 matchLabels: 8 app: test-app 9 replicas: 1 10 template: 11 metadata: 12 labels: 13 app: test-app 14 baidubce.com/bci: "true" 15 spec: 16 containers: 17 - command: ["/bin/sh", "-c", "echo 'A started'; sleep 36000"] 18 name: c1 19 image: registry.baidubce.com/wenzt-test/python:v1 20 imagePullPolicy: Always 21 env: 22 - name: BCI_CONTAINER_LAUNCH_PRIORITY 23 value: "0" 24 - name: c2 25 image: registry.baidubce.com/cce-plugin-dev/nginx:v1 26 imagePullPolicy: Always 27 env: 28 - name: BCI_CONTAINER_LAUNCH_PRIORITY 29 value: "200" 30 readinessProbe: 31 httpGet: 32 path: / 33 port: 80 34 initialDelaySeconds: 10 35 periodSeconds: 3 36 timeoutSeconds: 10 37 failureThreshold: 5 38 restartPolicy: Always 39 terminationGracePeriodSeconds: 300 40 automountServiceAccountToken: false 41
-
在Pod status中观察各个容器的启动时间。
Plain Text1kubectl describe pod <pod-name>
从返回信息的Containers中,可以看出c1容器的启动时间晚于c2容器。示例如下:
设置容器退出顺序
-
编写应用的YAML配置文件,然后使用该YAML文件创建Deployment。
Plain Text1kubectl apply -f container-exit.yaml
container-exit.yaml的内容示例如下,表示创建一个包含1个Pod副本的Deployment。Pod内包含两个容器,退出优先级从高到低依次为c2、c1。
Plain Text1apiVersion: apps/v1 2kind: Deployment 3metadata: 4 name: test-app 5spec: 6 selector: 7 matchLabels: 8 app: test-app 9 replicas: 1 10 template: 11 metadata: 12 labels: 13 app: test-app 14 baidubce.com/bci: "true" 15 spec: 16 containers: 17 - command: ["/bin/sh", "-c", "echo 'A started'; sleep 36000"] 18 name: c1 19 image: registry.baidubce.com/wenzt-test/python:v1 20 imagePullPolicy: Always 21 env: 22 - name: BCI_CONTAINER_EXIT_PRIORITY 23 value: "0" 24 - name: c2 25 image: registry.baidubce.com/cce-plugin-dev/nginx:v1 26 imagePullPolicy: Always 27 env: 28 - name: BCI_CONTAINER_EXIT_PRIORITY 29 value: "100" 30 restartPolicy: Always 31 terminationGracePeriodSeconds: 300 32 automountServiceAccountToken: false
-
删除Pod,然后观察Pod内容器Killing事件的顺序。
说明: 如果需要确认容器退出顺序,请及时查看事件,Pod彻底删除后可能无法观察到相关事件
1kubectl describe pod <pod-name>
从返回信息的Events中,可以看出容器退出顺序为c2、c1。示例如下: