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

Kubernetes v1.31:透過快取一致性讀取加速叢集效能

Kubernetes 因其對容器化應用的強大編排能力而聞名,但隨著叢集規模的增長,控制平面的需求可能成為瓶頸。一個關鍵挑戰是確保從 etcd 資料儲存中進行強一致性讀取,這需要消耗大量資源的法定人數讀取(quorum read)。

今天,Kubernetes 社群激動地宣佈一項重大改進:*從快取中進行一致性讀取*(consistent reads from cache),該功能在 Kubernetes v1.31 中進入 Beta 階段。

為什麼一致性讀取很重要

一致性讀取對於確保 Kubernetes 元件能夠準確瞭解最新的叢集狀態至關重要。保證一致性讀取對於維護 Kubernetes 操作的準確性和可靠性至關重要,它使元件能夠根據最新資訊做出明智的決策。在大型叢集中,獲取和處理這些資料可能成為效能瓶頸,特別是對於涉及篩選結果的請求。雖然 Kubernetes 可以直接在 etcd 內按名稱空間篩選資料,但任何其他按標籤或欄位選擇器進行的篩選都需要從 etcd 中獲取整個資料集,然後在 Kubernetes API 伺服器的記憶體中進行篩選。這對 kubelet 等元件的影響尤為顯著,kubelet 只需要列出排程到其節點上的 Pod,但之前卻需要 API 伺服器和 etcd 來處理叢集中的所有 Pod。

突破:充滿信心的快取

長期以來,Kubernetes 一直使用 watch 快取來最佳化讀取操作。Watch 快取儲存了叢集狀態的快照,並透過 etcd watch 接收更新。然而,直到現在,它還不能直接提供一致性讀取,因為無法保證快取足夠新。

*從快取中進行一致性讀取* 功能透過利用 etcd 的 進度通知(progress notifications)機制解決了這個問題。這些通知會告知 watch 快取其資料與 etcd 相比的最新程度。當請求一致性讀取時,系統首先檢查 watch 快取是否為最新。如果快取不是最新的,系統會查詢 etcd 以獲取進度通知,直到確認快取足夠新。一旦就緒,讀取請求將直接從快取中高效地得到處理,這可以顯著提高效能,特別是在需要從 etcd 獲取大量資料的情況下。這使得篩選資料的請求可以從快取中處理,而只需從 etcd 中讀取最少的元資料。

重要提示:要從此功能中受益,您的 Kubernetes 叢集必須執行 etcd 3.4.31+ 或 3.5.13+ 版本。對於較舊的 etcd 版本,Kubernetes 將自動回退到直接從 etcd 提供一致性讀取。

您會注意到的效能提升

這個看似簡單的改變對 Kubernetes 的效能和可伸縮性產生了深遠的影響

  • 減少 etcd 負載:Kubernetes v1.31 可以減輕 etcd 的工作量,從而為其他關鍵操作釋放資源。
  • 更低的延遲:從快取中讀取資料比從 etcd 獲取和處理資料要快得多。這意味著元件的響應速度更快,從而提高了整個叢集的響應能力。
  • 提高可伸縮性:擁有數千個節點和 Pod 的大型叢集將看到最顯著的收益,因為 etcd 負載的減少使控制平面能夠在不犧牲效能的情況下處理更多請求。

5000 節點可伸縮性測試結果:在最近對 5000 節點叢集進行的可伸縮性測試中,啟用從快取中一致性讀取帶來了令人印象深刻的改進

  • kube-apiserver CPU 使用率**降低 30%**
  • etcd CPU 使用率**降低 25%**
  • 第 99 百分位的 Pod LIST 請求延遲**最多減少 3 倍**(從 5 秒減少到 1.5 秒)

接下來是什麼?

隨著該功能進入 Beta 階段,從快取中一致性讀取功能預設啟用,為所有執行受支援 etcd 版本的 Kubernetes 使用者提供了無縫的效能提升。

我們的旅程並未就此結束。Kubernetes 社群正在積極探索在 watch 快取中支援分頁,這將在未來釋放更多的效能最佳化。

開始使用

升級到 Kubernetes v1.31 並確保您使用的是 etcd 3.4.31+ 或 3.5.13+ 版本是體驗從快取中一致性讀取好處的最簡單方法。如果您有任何問題或反饋,請隨時聯絡 Kubernetes 社群。

讓我們知道*從快取中一致性讀取*如何改變您的 Kubernetes 體驗!

特別感謝 @ah8ad3 和 @p0lyn0mial 對此功能的貢獻!