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