本文發表於一年多前。舊文章可能包含過時內容。請檢查頁面中的資訊自發布以來是否已變得不正確。

Kubernetes v1.28:引入原生 Sidecar 容器

本文解釋瞭如何使用新的 sidecar 功能,該功能支援可重啟的 Init 容器,並在 Kubernetes 1.28 中以 Alpha 階段提供。我們希望得到你的反饋,以便我們能儘快將此功能推向成熟。

“sidecar” 的概念幾乎從 Kubernetes 誕生之初就存在了。2015 年,在一篇關於複合容器的博文中,sidecar 被描述為“擴充套件和增強‘主’容器”的附加容器。Sidecar 容器已成為一種常見的 Kubernetes 部署模式,通常用於網路代理或作為日誌系統的一部分。到目前為止,sidecar 只是 Kubernetes 使用者在沒有原生支援的情況下應用的一個概念。缺乏原生支援導致了一些使用上的不便,本次功能增強旨在解決這些問題。

1.28 中的 Sidecar 容器是什麼?

Kubernetes 1.28 為Init 容器添加了一個新的 restartPolicy 欄位,當 SidecarContainers 功能門控被啟用時可用。

apiVersion: v1
kind: Pod
spec:
  initContainers:
  - name: secret-fetch
    image: secret-fetch:1.0
  - name: network-proxy
    image: network-proxy:1.0
    restartPolicy: Always
  containers:
  ...

該欄位是可選的,如果設定,唯一有效的值是 Always。設定此欄位會改變 Init 容器的行為,具體如下:

  • 如果容器退出,它會重啟。
  • 任何後續的 Init 容器都會在啟動探針(startupProbe)成功完成後立即啟動,而不是等待可重啟的 Init 容器退出。
  • Pod 的資源使用計算方式發生變化,因為可重啟 Init 容器的資源現在會被加到主容器資源請求的總和中。

Pod 終止仍然僅取決於主容器。一個 restartPolicyAlways 的 Init 容器(稱為 sidecar)不會在主容器退出後阻止 Pod 終止。

可重啟 Init 容器的以下特性使其非常適合 sidecar 部署模式:

  • 無論你是否設定 restartPolicy,Init 容器都有明確的啟動順序,因此你可以確保你的 sidecar 在清單中任何位於 sidecar 宣告之後的容器宣告之前啟動。
  • Sidecar 容器不會延長 Pod 的生命週期,因此你可以在短生命週期的 Pod 中使用它們,而無需更改 Pod 的生命週期。
  • Sidecar 容器在退出時會重啟,這提高了彈性,讓你能夠使用 sidecar 提供主容器可以更可靠地消費的服務。

何時使用 Sidecar 容器

你可能會發現內建的 sidecar 容器對以下工作負載很有用:

  • 批處理或 AI/ML 工作負載,或其他執行至完成的 Pod。這些工作負載將體驗到最顯著的好處。
  • 網路代理,在清單中任何其他容器之前啟動。其他所有執行的容器都可以使用該代理容器的服務。有關說明,請參閱 Istio 中的 Kubernetes 原生 sidecar 博文
  • 日誌收集容器,現在可以在任何其他容器之前啟動,並一直執行到 Pod 終止。這提高了 Pod 中日誌收集的可靠性。
  • Job,可以使用 sidecar 來實現任何目的,而 Job 的完成不會被正在執行的 sidecar 阻塞。無需額外配置即可確保此行為。

在 1.28 之前,使用者是如何實現 Sidecar 行為的?

在 sidecar 功能出現之前,根據 sidecar 容器期望的生命週期,有以下幾種實現 sidecar 行為的選項:

  • Sidecar 的生命週期短於 Pod 生命週期:使用 Init 容器,它提供了明確的啟動順序。但是,sidecar 必須退出,其他 Init 容器和主 Pod 容器才能啟動。
  • Sidecar 的生命週期等於 Pod 生命週期:使用一個與工作負載容器一起在 Pod 中執行的主容器。這種方法無法控制啟動順序,並且可能導致 sidecar 容器在工作負載容器退出後阻止 Pod 終止。

內建的 sidecar 功能解決了生命週期等於 Pod 生命週期的用例,並具有以下額外的好處:

  • 提供對啟動順序的控制
  • 不阻塞 Pod 終止

將現有 Sidecar 過渡到新模型

在 Alpha 階段,我們建議僅在短期測試叢集中使用 sidecars 功能門控。如果你現有的 sidecar 被配置為主容器,以便它可以執行到 Pod 的整個生命週期,那麼可以將其移動到 Pod 規範的 initContainers 部分,併為其設定 restartPolicyAlways。在許多情況下,sidecar 的工作方式應與之前相同,但增加了定義啟動順序和不延長 Pod 生命週期的好處。

已知問題

內建 sidecar 容器的 Alpha 版本存在以下已知問題,我們將在功能進入 Beta 階段之前解決這些問題:

  • CPU、記憶體、裝置和拓撲管理器不知道 sidecar 容器的生命週期和額外的資源使用情況,它們的行為會像 Pod 的資源請求比實際更低一樣。
  • 當使用 sidecar 時,kubectl describe node 的輸出是不正確的。輸出顯示的資源使用量低於實際使用量,因為它沒有使用新的 sidecar 容器資源使用計算方法。

我們需要你的反饋!

在 Alpha 階段,我們希望你在你的環境中試用 sidecar 容器,如果遇到錯誤或不便之處,請提交 issue。我們特別對以下方面的反饋感興趣:

  • 關閉順序,尤其是在有多個 sidecar 執行時
  • 針對崩潰的 sidecar 的退避超時調整
  • 當 sidecar 執行時,Pod 的就緒和存活探針的行為

要提交 issue,請訪問 Kubernetes GitHub 倉庫

下一步是什麼?

除了將要解決的已知問題外,我們還在努力為 sidecar 和主容器新增終止順序。這將確保 sidecar 容器僅在 Pod 的主容器退出後才終止。

我們很高興看到 sidecar 功能來到 Kubernetes,並期待你的反饋。

致謝

距離最初的 KEP 編寫已經過去了很多年,所以如果我們遺漏了這些年來為這個功能做出貢獻的任何人,我們深表歉意。這是我們盡最大努力對參與這項工作的人員表示認可。

更多資訊