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