重调度(Descheduling)通常是指将部署在某个节点上调度不合理的Pod重新调度到另一个节点。在集群利用率不均而产生热点节点、节点属性变化导致存量Pod调度规则不匹配等场景下,您可以使用重调度来优化资源使用,确保Pod在最佳节点上运行,从而保障集群的高可用性和工作负载的高效运行。
阅读前提示
为了帮助您更好地使用重调度功能,建议您提前了解以下概念:
参见Kubernetes官方文档了解Kubernetes调度器的工作机制,Kubernetes原生调度策略(例如污点和容忍、亲和性与反亲和性)等调度相关概念。
参见ack-koordinator(ack-slo-manager)了解ack-koordinator组件的架构和功能。
参见使用负载感知调度了解ACK集群如何根据节点实际的资源负载情况将Pod优先调度到负载较低的节点。
阅读完本文档后,您将了解:
在什么场景下需要使用重调度功能。
重调度的工作流程。
重调度相关概念,包括重调度模板、重调度策略Deschedule与Balance、驱逐器DefaultEvictor与MigrationController。
为什么需要重调度功能
Kubernetes调度器会根据当前的集群状态决定如何将一个Pod调度到合适的节点上。但集群的状态会不断变化,出于某些原因,某些场景下可能需要将运行中的Pod移动到其他节点,例如:
集群的工作负载分布不均,造成某些节点过载,影响这些热点节点上的工作负载性能。
集群的总体资源利用率较低,期望下线部分节点以节约成本。这些节点上的Pod需要重新调度到其他节点上。
集群存在大量资源碎片,导致集群资源总量充足,但单节点上资源不足。此时一些较大规格的Pod无法调度,增加了集群资源成本。
节点新增或移除了污点或标签,导致不再符合该节点上某些Pod的亲和性要求,需要将这些Pod迁移至满足条件的节点上。
例如,应用在不同时间段的负载水位差异较大,在流量高峰期可能会产生热点节点,进而影响应用的服务质量。此时,重调度功能可以驱逐异常的Pod,缓解热点节点的压力,保障工作负载的服务质量达到预期标准。
为了解决以上问题,ack-koordinator组件提供了重调度器模块Koordinator Descheduler,以Deployment的形式部署在节点上。Koordinator Descheduler基于社区Kubernetes Descheduler的Descheduling Framework重调度框架实现,兼容了目前社区Kubernetes Descheduler提供的全部重调度策略,并在此基础上对重调度策略、Pod驱逐方式、驱逐流量控制、驱逐过程观测等多维度进行了增强,优化了Pod重调度的体验。关于Koordinator Descheduler与Kubernetes Descheduler关联与差异,请参见Koordinator Descheduler与Kubernetes Descheduler。
重调度工作流程
Koordinator Descheduler周期性运行,您可以配置多种重调度策略,对Pod进行筛选和检查,并对满足驱逐条件的目标Pod进行驱逐。其整体的工作流程如下图所示。
遍历每个重调度模板,依次执行每个重调度模板中开启的Deschedule类型的策略。
获取节点、工作负载和Pod的数据信息。
根据Deschedule策略规则筛选满足驱逐条件的Pod。
对所有满足驱逐条件Pod进行过滤、检查和排序。
由重调度模板中开启的Pod驱逐器发起Pod驱逐请求。
再次遍历每个重调度模板,依次执行每个重调度模板中开启的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组件本身的安装和使用是免费的,但在部分场景下可能会产生额外费用。更多信息,请参见费用说明。