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