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进行安装与配置。
相关文档
您可以安装ack-koordinator组件并开启重调度功能,请参见启用重调度功能。
您也可以在ConfigMap中对系统、重调度模板、策略插件和驱逐器插件进行高级配置,请参见高级配置参数。
关于ack-koordinator组件的详细介绍及变更记录,请参见ack-koordinator(ack-slo-manager)。