kube-scheduler队列之间倒换pod

k8s 1.19.0

默认从unschedulableQ出来,说明已经退避完成。

pkg/scheduler/scheduler.go
Run方法

pkg/scheduler/internal/queue/scheduling_queue.go
Run方法

上次调度失败时间+2^(尝试调度次数-1)s小于当前时间时,表示退避完成。其中,最大退避时间是10s。等待时间最快60s,最慢90s,重新加入activeQ进行重新调度。

pkg/scheduler/internal/queue/scheduling_queue.go
MoveAllToActiveOrBackoffQueue方法
当pod或者node等资源发生变化时,把unschedulableQ中pod放入backoffQ或者activeQ。

如何减少无效重试?

QueueingHint 是 kube-scheduler 的一个调度框架扩展点,它的核心作用是:当集群发生变化时,给调度器一个"提示",告诉它某个不可调度的 Pod 是否值得重新放回调度队列中尝试。
只要有集群事件(比如节点变化、Pod 增删),就把所有相关的不可调度 Pod 重新入队尝试,导致很多无效的重试,浪费调度周期。
有了 QueueingHint 之后,每个调度插件可以注册自己的回调函数,精确判断:
- 这次集群变化是否真的能解决这个 Pod 的调度失败原因?
- 如果能 → 返回 Queue (重新入队)
- 如果不能 → 返回 Skip (跳过,不浪费调度资源)
例如,NodeAffinity 插件导致 Pod 不可调度,当某个节点的 label 变化时:
- 如果新 label 匹配 Pod 的 nodeAffinity 要求 → Queue (重新尝试)
- 如果新 label 不匹配 → Skip (不用试了,还是失败)
这样可以大幅减少无效的调度重试,提升调度器吞吐量。

版本

阶段

说明

v1.28

首次实验性引入

在少数 in-tree 插件中开始实现,但因内存泄漏问题在 patch release 中被禁用

v1.31

Alpha

通过 feature gate SchedulerQueueingHints 启用,支持 Pod/Updated 事件的 QueueingHint 判断

v1.32

Beta(默认开启)

所有 in-tree 插件都实现了 QueueingHint,修复了内存泄漏,默认启用,官方博客正式发布

v1.34

GA / Stable

特性毕业为稳定版,默认开启,feature gate 移除

posted on 2024-11-13 00:01  王景迁  阅读(61)  评论(0)    收藏  举报

导航