全部產品
Search
文件中心

Container Compute Service:配置Sidecar容器啟停順序

更新時間:Jul 24, 2025

當您採用Sidecar容器的形式實作類別似DaemonSet的效果,從而提供額外的服務或功能(如日誌記錄、監控、安全性或流量轉寄),這些功能需要控制Sidecar容器相對於主應用程式容器的啟停順序。本文介紹如何配置Sidecar容器啟停順序。

功能說明

在ACS情境下,由於虛擬節點的限制,不支援Kubernetes的DaemonSet功能。此時部分需要使用DaemonSet的情境可以採用為Pod添加Sidecar容器的形式來實作類別似效果。 然而,Sidecar容器的生命週期無法獨立於Pod的生命週期。為了達到類似於DaemonSet的效果,您需要進行一些配置來控制Sidecar容器的啟停順序。保證Sidecar容器在Pod建立時先於應用主容器啟動, 並保證在Job類Pod中業務容器已經退出的情況下, 強制終止Sidecar容器。

針對上述情境,ACS支援通過兩種方式配置Sidecar容器的啟停順序:

  • 社區原生Sidecar聲明

    在K8s 1.29及以上的版本, 預設支援原生的Sidecar聲明方式。 即通過把Sidecar配置為Init容器,並將restartPolicy設定成Always。

    說明

    原生Sidecar方式將Sidecar容器作為一個特殊的Init容器來實現。Pod啟動時,應用程式容器需要等待Sidecar容器完成啟動之後才可以正常運行。同時restartPolicy: Always的配置使得Sidecar容器可以啟動、停止和重新啟動,且不會影響主應用程式容器和其他Init容器。

  • ACS定製聲明

    對於K8s 1.28及以下的版本, ACS支援為普通容器設定一個特殊的環境變數__IS_SIDECAR__,來標記此容器是否為Sidecar。

    重要

    ACS定製聲明的方式,支援將普通容器聲明為Sidecar,先於其他普通容器啟動,並按restartPolicyAlways的原則自動重試。同時,ACS叢集在低版本K8s(1.28及以下)做了相容,確保Container狀態可以得到更新。

    但在高版本或其他類型的的K8s叢集中,受限於K8s對於Container狀態的更新限制,ACS定製聲明的Sidecar容器在失敗重試後,containerStatus和Pod狀態中並不會更新為Running,請以Pod實際狀態為準。建議您將叢集升級至1.29以上版本,並使用社區原生Sidecar聲明的方式。

配置說明

配置方法

Pod欄位/環境變數名稱

配置說明

社區原生Sidecar聲明

Init容器的restartPolicy欄位

  • Never: 表示容器類型為普通的Init容器。 預設值為Never。

  • Always:表示容器類型為Sidecar容器。

ACS定製聲明

普通容器的環境變數:__IS_SIDECAR__

  • true:表示容器類型為Sidecar容器。

  • false:表示容器類型為普通容器。預設值為false。

配置樣本

  1. test-sidecar.yaml的內容樣本如下,表示建立一個Job,Job內包含兩個容器,app為業務容器,sidecar為Sidecar容器。

    ACS定製聲明

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: test
    spec:
      template:
        metadata:
          labels:
            app: test
        spec:
          containers:
          - name: app
            image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28
            command: ['sh', '-c', 'for i in $(seq 1 10);do echo "logging" >> /var/logs.txt; sleep 1; done']
          - name: sidecar
            image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28
            command: ['sh', '-c', 'touch /var/logs.txt && tail -F /var/logs.txt']
            env:
            - name: __IS_SIDECAR__   # 為此容器設定環境變數
              value: "true"          # 標記此容器為sidecar
          restartPolicy: Never
      backoffLimit: 2

    社區原生Sidecar聲明

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: test
    spec:
      template:
        metadata:
          labels:
            app: test
        spec:
          initContainers:
          - name: sidecar
            image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28
            command: ['sh', '-c', 'touch /var/logs.txt && tail -F /var/logs.txt']
            restartPolicy: Always  # 聲明此容器為sidecar
          containers:
          - name: app
            image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28
            command: ['sh', '-c', 'for i in $(seq 1 10);do echo "logging" >> /var/logs.txt; sleep 1; done']
          restartPolicy: Never
      backoffLimit: 2
  2. 執行以下命令,建立Job。

    kubectl apply -f test-sidecar.yaml
  3. 查看Job詳情和對應的Pod詳情,觀察環境變數的效果。

    • 確認Job已經運行完成,且狀態為Succeeded

      kubectl describe job <job-name>

      樣本如下:

      image

  4. 查看Sidecar容器詳情,觀察容器的啟動順序和實際的退出碼

    kubectl describe pod <pod-name>
    • 容器的啟動順序樣本如下,可以看到sidecar容器先於app容器啟動, 從而保證應用主容器依賴的sidecar功能(例如流量轉寄)提前就緒;另外,可以看到app容器運行結束後(10s後),sidecar容器會被強制殺掉,從而保證作業Pod可以完成:

      image

    • 退出碼樣本如下,可以看到sidecar容器被強制退出,且退出碼是0,保證不會干擾作業Pod運行是成功還是失敗的判斷。

      image