kube-scheduler笔记之Queue研究
代码结构
type PriorityQueue struct {
// backoff队列
podBackoff *util.PodBackoff
// backoff队列, 与podBackoff区别?
podBackoffQ *util.Heap
// activeQ is heap structure that scheduler actively looks at to find pods to
// schedule. Head of heap is the highest priority pod.
activeQ *util.Heap
// unschedulable队列
unschedulableQ *UnschedulablePodsMap
// 抢占式调度成功后, 将preemptor放到nominatedPodMap里
nominatedPods *nominatedPodMap
// 全局调度周期的递增序号,当pod pop的时候会递增
schedulingCycle int64
// 当未调度的pod重新被添加到activeQueue中会保存schedulingCycle到moveRequestCycle中
moveRequestCycle int64
}
核心解读
- Heap结构, 即为最大堆.
- activeQ: 存储所有等待调度的Pod的队列, 根据pod.Spec.Priority来构建最大堆
- podBackoffQ: 存储在多个schedulingCycle中依旧调度失败的情况下,则会通过之前说的backOff机制,延迟等待调度的时间. 但该backoffQ是纯的PodHeap, 并没有存储pod的backOff的具体信息
- podBackoff: 类似一个记分板, backoff的计数器,最后一次更新的时间等
- unschedulableQ: 本质上是<podName, podInfo>的map, 而不是一个队列.
重点疑问
在什么时候Pod被加入到activeQ中? 何时加入podBackoffQ中? 何时加入unschedulableQ中? Pod在这几个Q中间是如何变化的?
podBackoffQ是按照什么来划分优先级的?
- 如果仍然是按照优先级来, 如何防止高优先级Pod反复拉起, 反复失败?
- 应该是按照调度失败次数? 还是调度等待时长?
- 根据podsCompareBackoffCompleted, 按照podBackoffTime, 即调度失败次数. 调度等待时长与调度失败次数有一个函数关系.
- 如果pod从podBackoffQ中移入到activeQ中, 接下来调度失败, 重新移入podBackoffQ中, 此时podBackoffTime会重置么?
从unschedulableQ中移出pod的优先级是怎样的?
Pod调度失败的终止条件是什么? 还是说没有终止条件? 始终在几个Queue中打转?
- 对的. 除非显式调用api删除掉该Pod
各个队列有大小限制么? 如何防止Pod请求积压过多导致Queue(内存)满了?