本文發表於一年多前。舊文章可能包含過時內容。請檢查頁面中的資訊自發布以來是否已變得不正確。
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 終止仍然僅取決於主容器。一個 restartPolicy
為 Always
的 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
部分,併為其設定 restartPolicy
為 Always
。在許多情況下,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 編寫已經過去了很多年,所以如果我們遺漏了這些年來為這個功能做出貢獻的任何人,我們深表歉意。這是我們盡最大努力對參與這項工作的人員表示認可。
- mrunalp 參與了設計討論和審查
- thockin 多年來參與了 API 討論並提供了支援
- bobbypage 參與了審查
- smarterclayton 提供了詳細的審查和反饋
- howardjohn 多年來提供了反饋,並在實現期間早期試用
- derekwaynecarr 和 dchen1107 提供了領導支援
- jpbetz 參與了 API 和終止順序的設計以及程式碼審查
- Joseph-Irving 和 rata 多年前參與了早期迭代的設計和審查
- swatisehgal 和 ffromani 就資源管理器影響提供了早期反饋
- alculquicondor 就解決排程器版本偏差問題提供了反饋
- wojtek-t 對 KEP 進行了 PRR 審查
- ahg-g 審查了 KEP 的排程器部分
- adisky 解決了 Job 完成問題
更多資訊
- 閱讀 Kubernetes 文件中的 Sidecar 容器 API
- 閱讀 Sidecar KEP