邊車容器

功能狀態: Kubernetes v1.29 [beta]

邊車容器是與主要應用程式容器在同一個 Pod 中一起執行的次要容器。這些容器用於增強或擴展主要應用程式容器的功能,方法是提供額外的服務或功能,例如記錄、監控、安全性或資料同步,而無需直接變更主要應用程式程式碼。

一般而言,您在 Pod 中只會有一個應用程式容器。例如,如果您有一個需要本機網頁伺服器的網頁應用程式,則本機網頁伺服器是邊車容器,而網頁應用程式本身是應用程式容器。

Kubernetes 中的邊車容器

Kubernetes 將邊車容器實作為初始化容器的特殊情況;邊車容器在 Pod 啟動後仍保持執行。本文件使用常規初始化容器一詞,清楚地指僅在 Pod 啟動期間執行的容器。

假設您的叢集已啟用 SidecarContainers 功能閘道(此功能自 Kubernetes v1.29 起預設為啟用),您可以為 Pod 的 initContainers 欄位中列出的容器指定 restartPolicy。這些可重新啟動的邊車容器獨立於其他 init 容器以及相同 Pod 內的主要應用程式容器。這些容器可以啟動、停止或重新啟動,而不會影響主要應用程式容器和其他 init 容器。

您也可以執行具有多個未標記為 init 或邊車容器的 Pod。如果 Pod 內的多個容器是 Pod 整體運作所必需的,而且您不需要控制哪些容器先啟動或停止,則此方法很適用。如果您需要支援不支援容器層級 restartPolicy 欄位的舊版 Kubernetes,您也可以這樣做。

範例應用程式

以下是一個 Deployment 範例,其中包含兩個容器,其中一個是邊車容器

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
  labels:
    app: myapp
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
        - name: myapp
          image: alpine:latest
          command: ['sh', '-c', 'while true; do echo "logging" >> /opt/logs.txt; sleep 1; done']
          volumeMounts:
            - name: data
              mountPath: /opt
      initContainers:
        - name: logshipper
          image: alpine:latest
          restartPolicy: Always
          command: ['sh', '-c', 'tail -F /opt/logs.txt']
          volumeMounts:
            - name: data
              mountPath: /opt
      volumes:
        - name: data
          emptyDir: {}

邊車容器和 Pod 生命週期

如果 init 容器建立時將其 restartPolicy 設定為 Always,則它將在 Pod 的整個生命週期內啟動並保持執行。這對於執行與主要應用程式容器分離的支援服務非常有用。

如果為此 init 容器指定了 readinessProbe,則其結果將用於判斷 Pod 的 ready 狀態。

由於這些容器被定義為 init 容器,因此它們受益於與常規 init 容器相同的排序和順序保證,允許您將邊車容器與常規 init 容器混合使用,以實現複雜的 Pod 初始化流程。

與常規 init 容器相比,在 .spec.initContainers 內定義的邊車容器在啟動後會繼續執行。當 Pod 的 .spec.initContainers 內有多個條目時,這一點很重要。在邊車樣式的 init 容器執行後(kubelet 已將該 init 容器的 started 狀態設定為 true),kubelet 接著從排序後的 .spec.initContainers 列表中啟動下一個 init 容器。該狀態會變為 true,原因可能是容器中正在執行進程且未定義啟動探針,或是因為其 startupProbe 成功。

在 Pod 終止時,kubelet 會延遲終止邊車容器,直到主要應用程式容器完全停止。然後,邊車容器會按照它們在 Pod 規格中出現的相反順序關閉。這種方法確保邊車容器保持運作,支援 Pod 內的其他容器,直到不再需要它們的服務為止。

具有邊車容器的 Job

如果您定義一個使用 Kubernetes 樣式 init 容器的 Job,則每個 Pod 中的邊車容器不會阻止 Job 在主要容器完成後完成。

以下是一個 Job 範例,其中包含兩個容器,其中一個是邊車容器

apiVersion: batch/v1
kind: Job
metadata:
  name: myjob
spec:
  template:
    spec:
      containers:
        - name: myjob
          image: alpine:latest
          command: ['sh', '-c', 'echo "logging" > /opt/logs.txt']
          volumeMounts:
            - name: data
              mountPath: /opt
      initContainers:
        - name: logshipper
          image: alpine:latest
          restartPolicy: Always
          command: ['sh', '-c', 'tail -F /opt/logs.txt']
          volumeMounts:
            - name: data
              mountPath: /opt
      restartPolicy: Never
      volumes:
        - name: data
          emptyDir: {}

與應用程式容器的差異

邊車容器與同一個 Pod 中的應用程式容器並排執行。但是,它們不執行主要應用程式邏輯;相反地,它們為主要應用程式提供支援功能。

邊車容器有自己獨立的生命週期。它們可以獨立於應用程式容器啟動、停止和重新啟動。這表示您可以更新、擴展或維護邊車容器,而不會影響主要應用程式。

邊車容器與主要容器共用相同的網路和儲存命名空間。這種共置允許它們緊密互動並共享資源。

從 Kubernetes 的角度來看,邊車容器的正常終止不太重要。當其他容器佔用所有分配的正常終止時間時,邊車容器將比預期的更快收到 SIGTERM,隨後是 SIGKILL。因此,對於邊車容器,與 0 不同的退出代碼(0 表示成功退出)在 Pod 終止時是正常的,並且通常應被外部工具忽略。

與 init 容器的差異

邊車容器與主要容器並排工作,擴展其功能並提供額外服務。

邊車容器與主要應用程式容器同時執行。它們在 Pod 的整個生命週期中處於活動狀態,並且可以獨立於主要容器啟動和停止。與 init 容器不同,邊車容器支援 探針 來控制其生命週期。

邊車容器可以直接與主要應用程式容器互動,因為與 init 容器一樣,它們始終共享相同的網路,並且可以選擇性地共享磁碟區(檔案系統)。

Init 容器在主要容器啟動之前停止,因此 init 容器無法與 Pod 中的應用程式容器交換訊息。任何資料傳遞都是單向的(例如,init 容器可以將資訊放入 emptyDir 磁碟區中)。

容器內的資源共享

考慮到 init 容器、邊車容器和應用程式容器的執行順序,以下資源使用規則適用

  • 在所有 init 容器上定義的任何特定資源請求或限制中的最高值是有效 init 請求/限制。如果任何資源未指定資源限制,則視為最高限制。
  • Pod 的資源有效請求/限制Pod 額外開銷 與以下兩者中較高者的總和
    • 所有非 init 容器(應用程式容器和邊車容器)的資源請求/限制的總和
    • 資源的有效 init 請求/限制
  • 排程是根據有效請求/限制完成的,這表示 init 容器可以為初始化保留在 Pod 生命週期內未使用的資源。
  • Pod 的 有效 QoS 層級的 QoS(服務品質)層級是所有 init 容器、邊車容器和應用程式容器的 QoS 層級。

配額和限制根據有效的 Pod 請求和限制套用。

邊車容器和 Linux cgroups

在 Linux 上,Pod 層級控制群組 (cgroups) 的資源分配基於有效的 Pod 請求和限制,與排程器相同。

下一步

上次修改時間:2024 年 10 月 06 日下午 10:40 PST:[SidecarContainer] provide sidecar implementation best practices hints (7195f5feaa)