重调度概述

重调度(Descheduling)通常是指将部署在某个节点上调度不合理的Pod重新调度到另一个节点。在集群利用率不均而产生热点节点、节点属性变化导致存量Pod调度规则不匹配等场景下,您可以使用重调度来优化资源使用,确保Pod在最佳节点上运行,从而保障集群的高可用性和工作负载的高效运行。

阅读前提示

为了帮助您更好地使用重调度功能,建议您提前了解以下概念:

阅读完本文档后,您将了解:

  • 在什么场景下需要使用重调度功能。

  • 重调度的工作流程。

  • 重调度相关概念,包括重调度模板、重调度策略Deschedule与Balance、驱逐器DefaultEvictor与MigrationController。

为什么需要重调度功能

Kubernetes调度器会根据当前的集群状态决定如何将一个Pod调度到合适的节点上。但集群的状态会不断变化,出于某些原因,某些场景下可能需要将运行中的Pod移动到其他节点,例如:

  • 集群的工作负载分布不均,造成某些节点过载,影响这些热点节点上的工作负载性能。

  • 集群的总体资源利用率较低,期望下线部分节点以节约成本。这些节点上的Pod需要重新调度到其他节点上。

  • 集群存在大量资源碎片,导致集群资源总量充足,但单节点上资源不足。此时一些较大规格的Pod无法调度,增加了集群资源成本。

  • 节点新增或移除了污点或标签,导致不再符合该节点上某些Pod的亲和性要求,需要将这些Pod迁移至满足条件的节点上。

例如,应用在不同时间段的负载水位差异较大,在流量高峰期可能会产生热点节点,进而影响应用的服务质量。此时,重调度功能可以驱逐异常的Pod,缓解热点节点的压力,保障工作负载的服务质量达到预期标准。

为了解决以上问题,ack-koordinator组件提供了重调度器模块Koordinator Descheduler,以Deployment的形式部署在节点上。Koordinator Descheduler基于社区Kubernetes DeschedulerDescheduling Framework重调度框架实现,兼容了目前社区Kubernetes Descheduler提供的全部重调度策略,并在此基础上对重调度策略、Pod驱逐方式、驱逐流量控制、驱逐过程观测等多维度进行了增强,优化了Pod重调度的体验。关于Koordinator Descheduler与Kubernetes Descheduler关联与差异,请参见Koordinator Descheduler与Kubernetes Descheduler

重调度工作流程

Koordinator Descheduler周期性运行,您可以配置多种重调度策略,对Pod进行筛选和检查,并对满足驱逐条件的目标Pod进行驱逐。其整体的工作流程如下图所示。

image
  1. 遍历每个重调度模板,依次执行每个重调度模板中开启的Deschedule类型的策略。

    1. 获取节点、工作负载和Pod的数据信息。

    2. 根据Deschedule策略规则筛选满足驱逐条件的Pod。

    3. 对所有满足驱逐条件Pod进行过滤、检查和排序。

    4. 由重调度模板中开启的Pod驱逐器发起Pod驱逐请求。

  2. 再次遍历每个重调度模板,依次执行每个重调度模板中开启的Balance类型的策略。流程类似步骤1。

其中涉及的术语概念如下。

重调度模板

针对不同类型的重调度需求,您可以配置一个或多个重调度模板。在每个重调度模板中,您可以指定希望使用的重调度策略以及Pod驱逐器,并差异化地配置对应的Pod生效范围和高级参数。

使用重调度模板能够根据不同的应用场景调整Pod的驱逐策略。例如,如需在不同的命名空间中驱逐超过不同存活时长的Pod,您可以配置多个重调度模板,对每一个命名空间中的Pod存活时长设置不同的阈值。

运行过程中,Koordinator Descheduler会按顺序遍历配置的所有重调度模板,先执行每个重调度模板中的Deschedule策略,待全部Deschedule策略执行完毕后,再一次遍历所有的重调度模板,执行每个重调度模板中的Balance策略。

重调度策略Deschedule与Balance

重调度策略可以决定哪些Pod应该被驱逐,包括Deschedule和Balance两种策略类型。关于策略类型支持的功能和配置方式,请参见策略插件配置

  • Deschedule:逐个检查Pod是否符合当前的调度约束,并依次进行驱逐,例如逐一驱逐不再满足节点亲和性或反亲和性的Pod。

  • Balance:优化所有Pod或一组Pod在集群中的分布均匀性,继而决定驱逐哪些Pod,例如基于节点的真实利用率驱逐负载热点上的Pod。

每个重调度策略的决策是相互独立的。重调度策略会按照自身的驱逐规则选择待驱逐的Pod,然后对符合规则的Pod进行过滤、检查和排序,期间会综合考量集群容量、资源利用率水位、副本数比例等约束,最终确定待驱逐的目标Pod,并请求Pod驱逐器完成对目标Pod的驱逐。

驱逐器与驱逐控制

Koordinator Descheduler中,驱逐器负责完成对目标Pod的驱逐,支持DefaultEvictor和MigrationController两种Pod驱逐器。

  • DefaultEvictor:提供基础的Pod驱逐功能,支持限制Pod驱逐的最大数量。DefaultEvictor在使用方法和配置上与Kubernetes Descheduler原生的驱逐器一致,请参见DefaultEvictor

  • MigrationController:支持更安全、可追溯的Pod驱逐迁移。详细的配置参数说明,请参见驱逐器插件配置

关于两者之间的详细差异对比说明,请参见差异对比

启用重调度功能

您可以安装ack-koordinator组件并开启重调度功能,请参见启用重调度功能

您也可以在ConfigMap中对系统、重调度模板、策略插件和驱逐器插件进行高级配置,请参见高级配置参数

相关文档

  • 如果您正在使用Kubernetes Descheduler,推荐您迁移至Koordinator Descheduler。关于组件之间的关联与差异,以及如何实现组件的迁移,请参见Koordinator Descheduler与Kubernetes Descheduler

  • 重调度功能由ack-koordinator组件的Koordinator Descheduler模块实现。ack-koordinator组件本身的安装和使用是免费的,但在部分场景下可能会产生额外费用。更多信息,请参见费用说明