全部產品
Search
文件中心

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

更新時間:Jul 06, 2024

本文介紹如何通過環境變數的方式,為一個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容器。樣本如下:

    容器啟動k8s.png

設定容器退出順序

  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。樣本如下:

    容器退出.png