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

Kubernetes 1.29:將汙點管理器與節點生命週期控制器解耦

這篇博文討論了 Kubernetes 1.29 中的一項新功能,以改進基於汙點的 Pod 驅逐處理。

背景

在 Kubernetes 1.29 中,引入了一項改進,以增強節點上基於汙點的 Pod 驅逐處理。這篇博文討論了對 node-lifecycle-controller 所做的更改,以分離其職責並提高整體程式碼的可維護性。

變更摘要

node-lifecycle-controller 之前結合了兩個獨立的功能:

  • 根據節點的狀況,向節點新增一組預定義的 NoExecute 汙點。
  • NoExecute 汙點執行 Pod 驅逐。

在 Kubernetes 1.29 版本中,基於汙點的驅逐實現已從 node-lifecycle-controller 中移出,成為一個名為 taint-eviction-controller 的獨立元件。這種分離旨在解耦程式碼、增強程式碼可維護性,併為未來對任一元件的擴充套件提供便利。

作為此變更的一部分,我們引入了額外的度量指標,以幫助你監控基於汙點的 Pod 驅逐:

  • pod_deletion_duration_seconds 衡量了從 Pod 的汙點效果被啟用到透過 taint-eviction-controller 刪除 Pod 之間的時間延遲。
  • pod_deletions_total 報告了自啟動以來 taint-eviction-controller 刪除的 Pod 總數。

如何使用這項新功能?

新增了一個名為 SeparateTaintEvictionController 的新特性門控。該功能在 Kubernetes 1.29 中作為 Beta 版本預設啟用。請參閱特性門控文件

啟用此功能後,使用者可以選擇性地透過在 kube-controller-manager 中設定 --controllers=-taint-eviction-controller 來停用基於汙點的驅逐。

要停用新功能並使用 node-lifecylecycle-controller 中的舊汙點管理器,使用者可以設定特性門控 SeparateTaintEvictionController=false

使用場景

這項新功能將允許叢集管理員擴充套件和增強預設的 taint-eviction-controller,甚至可以用自定義實現替換預設的 taint-eviction-controller,以滿足不同需求。例如,可以更好地支援在本地磁碟上使用 PersistentVolume 的有狀態工作負載。

常見問題解答

此功能是否會改變現有的基於汙點的 Pod 驅逐行為?

不會,基於汙點的 Pod 驅逐行為保持不變。如果特性門控 SeparateTaintEvictionController 被關閉,將繼續使用帶有汙點管理器的舊版 node-lifecycle-controller。

啟用/使用此功能是否會導致現有 SLI/SLO 覆蓋的任何操作所需的時間增加?

不會。

啟用/使用此功能是否會導致資源使用量(CPU、RAM、磁碟、IO等)增加?

執行一個獨立的 taint-eviction-controller 所增加的資源使用量可以忽略不計。

瞭解更多

更多詳情,請參閱 KEP

致謝

與任何 Kubernetes 功能一樣,眾多社群成員都做出了貢獻,從編寫 KEP 到實現新的控制器,再到審查 KEP 和程式碼。特別感謝:

  • Aldo Culquicondor (@alculquicondor)
  • Maciej Szulik (@soltysh)
  • Filip Křepinský (@atiratree)
  • Han Kang (@logicalhan)
  • Wei Huang (@Huang-Wei)
  • Sergey Kanzhelevi (@SergeyKanzhelev)
  • Ravi Gudimetla (@ravisantoshgudimetla)
  • Deep Debroy (@ddebroy)