Kubernetes 1.29:將 taint-manager 從節點生命週期控制器解耦
本部落格討論 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 中使用舊的 taint-manager,使用者可以設定功能閘道 SeparateTaintEvictionController=false
。
使用案例
這項新功能將允許叢集管理員擴展和增強預設的 taint-eviction-controller,甚至以自訂實作取代預設的 taint-eviction-controller,以滿足不同的需求。一個例子是更好地支援在本地磁碟上使用 PersistentVolume 的有狀態工作負載。
常見問題
此功能是否會變更基於污點的 Pod 驅逐的現有行為?
不會,基於污點的 Pod 驅逐行為保持不變。如果功能閘道 SeparateTaintEvictionController
關閉,則將繼續使用具有 taint-manager 的舊版 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)