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