ack-koordinator組件中的重調度器模組Koordinator Descheduler提供了重調度功能,可以將運行中的不合理的Pod重新調度到另一個節點。Koordinator Descheduler基於Kubernetes Descheduler社區提出的Descheduling Framework重調度架構實現,並在相容社區Kubernetes Descheduler重調度策略的基礎上進行了能力增強。
閱讀前提示
本文主要面向使用社區Kubernetes Descheduler的使用者,介紹Koordinator Descheduler與Kubernetes Descheduler的關聯,並指引如何完成組件的遷移。閱讀本文前,期望您已經瞭解社區Kubernetes Descheduler的功能說明、介面屬性、策略配置(例如系統配置、模板概要配置、策略外掛程式配置、驅逐器外掛程式配置)等內容。
Koordinator Descheduler與Kubernetes Descheduler的關聯
社區Kubernetes Descheduler在發布0.25.0前設計了Descheduling Framework,支援以外掛程式式架構的方式管理重調度的工作周期。Descheduling Framework主要包含兩個核心任務:
將現有的重調度策略和Pod驅逐邏輯進行外掛程式化改造,提高重調度策略的靈活性。
實現一個運行時環境,支援外掛程式的載入、執行,並管理整個重調度的工作周期。
在Kubernetes Descheduler發布0.26.0版本後,Koordinator Descheduler在v1.2.0版本完成了對社區重調度器全部的策略和驅逐外掛程式DefaultEvictor
的引入,並進一步提供了驅逐器外掛程式MirgrationController
。
功能差異
Koordinator Descheduler能夠相容Kubernetes Descheduler的絕大多數使用情境,但二者在配置方法、重調度策略、驅逐器與驅逐控制能力等方面具有一定的差異。主要如下。
由於Koordinator Descheduler在Descheduler Framework方面的研發早於Kubenetes Descheduler,所以使用了不同的配置介面
v1alpha2/DeschedulerConfiguration
。Koordinator Descheduler中新增了感知節點真實利用率的LowNodeLoad負載熱點打散重調度策略外掛程式。Kubernetes原生的Descheduler外掛程式LowNodeUtilization根據資源分派率決定如何進行重調度,而LowNodeLoad則基於節點真實利用率,更為精準。關於LowNodeLoad外掛程式的詳細介紹,請參見使用負載熱點打散重調度。
Koordinator Descheduler中新增了
MigrationController
作為Pod驅逐器。MigrationController
支援更加安全、更豐富的驅逐控制能力,請參見驅逐器外掛程式配置。
配置樣本對比
下面以開啟RemovePodsViolatingNodeTaints
策略(RemovePodsViolatingNodeTaints)為例,對比Kubernetes Descheduler和Koordinator Descheduler的配置格式,配置版本由apiVersion
和kind
兩個欄位定義。各版本的組件支援情況如下。
配置版本屬性 | Kubernetes Descheduler | Kubernetes Descheduler | Koordinator Descheduler |
組件版本 | 所有版本 | v0.27.0及以上 | 所有版本 |
|
|
|
|
|
|
|
|
Kubernetes Descheduler配置樣本
v0.27.0以下版本,使用的配置版本為
descheduler/v1alpha1/DeschedulerPolicy
# 介面屬性。 apiVersion: "descheduler/v1alpha1" kind: "DeschedulerPolicy" # 以下為系統配置。 nodeSelector: "node=node1" maxNoOfPodsToEvictPerNode: 10 maxNoOfPodsToEvictPerNamespace: 10 # 以下為驅逐配置。在另外兩種配置介面中,這些參數屬於驅逐器外掛程式的配置項。 evictFailedBarePods: false evictLocalStoragePods: true evictSystemCriticalPods: true evictDaemonSetPods: false ignorePvcPods: false # 以下為策略配置。在另外兩種配置介面中,以重調度模板的形式提供,並拆分成外掛程式啟停和外掛程式參數兩部分。 strategies: "RemovePodsViolatingNodeTaints": enabled: true params: nodeFit: true # nodeFit需要在每個策略中開啟。在另外兩種配置介面中,nodeFit屬於驅逐器外掛程式的配置項。 excludedTaints: - deschedule=not-allow # 忽略包含key為"deschedule"且value為"not-allow"的汙點的節點。
v0.27.0及以上版本,使用的配置版本為
descheduler/v1alpha2/DeschedulerPolicy
# 介面屬性。 apiVersion: "descheduler/v1alpha2" kind: "DeschedulerPolicy" # 以下為系統配置。 nodeSelector: "node=node1" maxNoOfPodsToEvictPerNode: 10 maxNoOfPodsToEvictPerNamespace: 10 # 以上為系統配置。 # 以下為模板列表。 profiles: - name: kubernetes-descheduler # 指定重調度模板的名稱。 # 以下為模板概要配置。 plugins: deschedule: enabled: - "RemovePodsViolatingNodeTaints" # enabled欄位的資料類型是字串列表。 balance: disabled: - "*" # 以上為模板概要配置。 # 以下為外掛程式列表。 pluginConfig: # 以下為策略外掛程式RemovePodsViolatingNodeTaints的配置。 - name: RemovePodsViolatingNodeTaints # 節點汙點校正外掛程式配置。 args: excludedTaints: - deschedule=not-allow # 忽略包含key為"deschedule"且value為"not-allow"的汙點的節點。 # 以下為驅逐器外掛程式DefaultEvictor的配置。 - name: "DefaultEvictor" args: evictFailedBarePods: false evictLocalStoragePods: true evictSystemCriticalPods: true evictDaemonSetPods: false ignorePvcPods: false nodeFit: true # nodeFit作為驅逐器外掛程式的配置項。
Koordinator Descheduler的配置樣本
配置版本為
descheduler/v1alpha2/DeschedulerConfiguration
# 介面屬性。 apiVersion: descheduler/v1alpha2 kind: DeschedulerConfiguration # 以下為系統配置。 dryRun: false deschedulingInterval: 120s nodeSelector: node: node1 # nodeSelector的資料類型與其他兩個配置介面不同。 maxNoOfPodsToEvictPerNode: 10 maxNoOfPodsToEvictPerNamespace: 10 # 以上為系統配置。 # 以下為模板列表。 profiles: - name: koord-descheduler # 以下為模板概要配置。 plugins: deschedule: enabled: - name: RemovePodsViolatingNodeTaints # enabled欄位的資料類型是結構體列表。 balance: disabled: - name: "*" evict: # 支援通過evict欄位配置需要使用的驅逐器。 enabled: - name: MigrationController # 預設開啟MigrationController。 # - name: DefaultEvictor # 可選DefaultEvictor。 filter: # 支援通過filter欄位配置需要使用的驅逐篩選策略。 enabled: - name: MigrationController # 預設開啟MigrationController。 # - name: DefaultEvictor # 可選DefaultEvictor。 # 以上為模板概要配置。 # 以下為外掛程式列表。 pluginConfig: # 以下為策略外掛程式RemovePodsViolatingNodeTaints的配置。 - name: RemovePodsViolatingNodeTaints # 節點汙點校正外掛程式配置。 args: excludedTaints: - deschedule=not-allow # 忽略包含key為"deschedule"且value為"not-allow"的汙點的節點。 # 以下為驅逐器外掛程式DefaultEvictor的配置。 - name: "DefaultEvictor" args: evictFailedBarePods: false evictLocalStoragePods: true evictSystemCriticalPods: true evictDaemonSetPods: false ignorePvcPods: false nodeFit: true # nodeFit作為驅逐器外掛程式的配置項。
系統配置差異
Kubernetes Descheduler的系統配置(Top Level configuration)中僅支援
nodeSelector
、maxNoOfPodsToEvictPerNode
、maxNoOfPodsToEvictPerNamespace
三個參數。在此基礎上,Koordinator Descheduler的系統配置中新增了dryRun
和deschedulingInterval
參數。Kubernetes Descheduler的
v1alpha1/DeschedulerPolicy
介面在系統配置中配置Pod驅逐器的參數,在其他兩個配置介面中,這些參數作為驅逐器外掛程式的配置項在args
欄位中提供。在Koordinator Descheduler的v1alpha2/DeschedulerConfiguration配置介面中,
nodeSelector
的資料類型與其他兩個配置介面略有不同,具體請參見系統配置。
模板概要配置差異
Kubernetes Descheduler的
v1alpha1/DeschedulerPolicy
配置版本不支援重調度模板,與當前Koordinator Descheduler的配置格式差異較大。Kubernetes Descheduler的
v1alpha2/DeschedulerPolicy
配置版本與Koordinator Descheduler的v1alpha2/DeschedulerConfiguration
類似,都使用重調度模板的配置形式。二者僅在模板概要配置中的資料類型以及驅逐外掛程式的開啟方法上有一定差異。v1alpha2/DeschedulerPolicy
使用字串列表開啟或禁用多個外掛程式;v1alpha2/DeschedulerConfiguration
使用plugins
結構體列表進行配置。v1alpha2/DeschedulerPolicy
僅支援DefaultEvictor驅逐器外掛程式,無需手動開啟;v1alpha2/DeschedulerConfiguration
支援MigrationController和DefaultEvictor兩種驅逐器外掛程式,其中DefaultEvictor的行為與社區版本一致。您可以在模板概要配置的evict
和filter
欄位中指定需要開啟的驅逐器外掛程式。
策略外掛程式配置差異
Koordinator Descheduler適配了Kubernetes Descheduler 0.26.0版本中的全部重調度策略。在Kubernetes Descheduler 0.26.0以上的版本中,某些重調度策略外掛程式新增的配置參數無法在Koordinator Descheduler中使用。請參見下表瞭解相較於Kubernetes Descheduler 0.26.0以上版本,Koordinator Descheduler的重調度策略的配置參數變更。
策略外掛程式的參數變更說明 | 範例程式碼 |
|
|
|
|
|
|
|
|
|
|
驅逐器外掛程式配置差異
Koordinator Descheduler適配了Kubernetes Descheduler 0.26.0版本中的Pod驅逐器DefaultEvictor。但對於Kubernetes Descheduler 0.26.0以上的版本DefaultEvictor的新增參數,Koordinator Descheduler無法使用。
Default Evictor
驅逐外掛程式的參數變更說明 | 範例 |
|
|
MigrationController
Koordinator Descheduler額外支援了MigrationController驅逐器外掛程式,支援多種驅逐方法。詳細介紹,請參見MigrationController。
遷移Kubernetes Descheduler至Koordinator Descheduler
不同版本的Kubernetes Descheduler遷移至Koordinator Descheduler的方式有所不同。遷移流程如下。
卸載正在使用的Kubernetes Descheduler。叢集中存在多個重調度器可能會導致出現不可預知的競態條件。
參見啟用重調度功能,對Koordinator Descheduler進行安裝與配置。
參見系統配置差異,在Koordinator Descheduler中配置您需要使用的系統級配置。
編寫與Koordinator Descheduler適配的重調度模板。
若您當前使用0.26.0版本及之前的Kubernetes Descheduler,該版本僅支援使用
v1alpha1/DeschedulerPolicy
配置介面。請參見模板概要配置差異完成配置。若您當前使用大於0.26.0版本的Kubernetes Descheduler,請進一步確認您所使用的配置介面。
請參見策略外掛程式配置差異和驅逐器外掛程式配置差異,在Koordinator Descheduler中設定外掛程式的具體配置。
相關文檔
您可以安裝ack-koordinator組件並開啟重調度功能,請參見啟用重調度功能。
您也可以在ConfigMap中對系統、重調度模板、策略外掛程式和驅逐器外掛程式進行進階配置,請參見進階配置參數。
關於ack-koordinator組件的詳細介紹及變更記錄,請參見ack-koordinator(ack-slo-manager)。