全部產品
Search
文件中心

Elastic Container Instance:設定容器啟動和退出順序

更新時間:Jun 03, 2026

本文介紹如何通過環境變數的方式,為一個ECI執行個體(即ECI Pod)內的各個容器設定啟動和退出優先順序,實現容器按順序啟動和退出。

功能說明

預設情況下,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。數值越大,退出優先順序越高。

  • 優先順序高的容器保證會在優先順序低的容器退出之前退出,相同優先順序的容器不保證退出順序(並發退出)。

重要

設定容器退出順序後,Pod總體的銷毀時間可能會大於Pod Spec中TerminationGracePeriodSeconds聲明的時間。

配置樣本

設定容器啟動順序

  1. 編寫應用的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
  2. 觀察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

設定容器退出順序

  1. 編寫應用的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
  2. 刪除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