本文介绍如何通过环境变量的方式,为一个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.yamltest-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容器。示例如下:Containers: c1: Container ID: containerd://779ec5b6d9ad1164c929ab0b8bbc4a3a3b24fe1f9654867e842f2dcfe7b24beb Image: registry.cn-shanghai.aliyuncs.com/eci_open/nginx:alpine Image ID: registry.cn-shanghai.aliyuncs.com/eci_open/nginx@sha256:2ec3c026183996087f26c6b3 Port: <none> Host Port: <none> State: Running Started: Wed, 16 Aug 2023 07:11:48 +0000 Ready: True Restart Count: 0 Readiness: http-get http://:80/ delay=30s timeout=1s period=3s #success=1 #failure=3 Environment: ECI_CONTAINER_LAUNCH_PRIORITY: 1000 Mounts: /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-2qkqp (ro) c2: Container ID: containerd://fe6261cc2e659ee9afb07c2efd516250aeb854544504d66ac011b557e94a0cb6 Image: registry.cn-shanghai.aliyuncs.com/eci_open/nginx:alpine Image ID: registry.cn-shanghai.aliyuncs.com/eci_open/nginx@sha256:2ec3c026183996087f26c6b38 Port: <none> Host Port: <none> Args: /bin/sh -c sleep 3600s State: Running Started: Wed, 16 Aug 2023 07:12:20 +0000 Ready: True Restart Count: 0 Environment: ECI_CONTAINER_LAUNCH_PRIORITY: 0
设置容器退出顺序
-
编写应用的YAML配置文件,然后使用该YAML文件创建Deployment。
kubectl apply -f test-exit.yamltest-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。示例如下:Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning MissingClusterDNS 2m10s virtual-kubelet pod: default/test-exit-pr and cannot create Pod using "ClusterFirst" policy. Falling back to "Default" policy. Normal DefaultInstanceTypeMatch 2m10s EciService [eci.containergroup]The de Warning ImageCacheMissed 2m9s EciService [eci.imagecache]Missed ima Normal ImageCacheAutoCreated 2m9s EciService [eci.imagecache]Image cach Normal Pulling 115s kubelet Pulling image "registry.cn Normal Pulled 113s kubelet Successfully pulled image ing) Normal Created 113s kubelet Created container c1 Normal Started 113s kubelet Started container c1 Normal Pulled 113s kubelet Container image "registry. Normal Created 113s kubelet Created container c2 Normal Started 113s kubelet Started container c2 Normal Pulled 113s kubelet Container image "registry. Normal Created 112s kubelet Created container c3 Normal Started 112s kubelet Started container c3 Normal Killing 37s kubelet Stopping container c1 Normal Killing 37s kubelet Stopping container c2 Normal Killing 7s kubelet Stopping container c3