scheduler优先级与抢占机制源码分析

抢占相关的配置介绍

PDB(Pod Disruption Budget):Pod干扰预算

Pod优先级和抢占

架构分析

流程分析

触发抢占逻辑

经过filter后,如果没有可调度的节点,则调用PostFilter运行抢占逻辑

节点经过filter后设置的两个状态 Unschedulable: 不可调度可抢占 UnschedulableAndUnresolvable: 不可调度不可抢占

默认的插件

        PostFilter: schedulerapi.PluginSet{
			Enabled: []schedulerapi.Plugin{
				{Name: defaultpreemption.Name},
			},
		},

代码分析

1.确保抢占者有资格抢占其他pod

a.检查pod.Spec.PreemptionPolicy设置的策略,没有设置或者PreemptNever都是没有资格抢占

b.检查pod.Status.NominatedNodeName字段

1)没有,选节点抢占

2)有

    a)被提名的节点从Unschedulable变为UnschedulableAndUnresolvable则重新选节点

    b)被提名的节点上有正在退出的cronJobPod或者低优先级pod则不重新选节点,否则重新选节点

2.找到抢占候选节点

a.过滤UnschedulableAndUnresolvable节点

b.根据MinCandidateNodesPercentage和MinCandidateNodesAbsolute确定候选节点数

c.运行候选节点数个goroutine,在候选节点上选择受害pod,同时计算受害pod中违反PDB的数量

3.通过Extenders过滤掉一些候选节点

4.选择最佳候选节点

a.PDB 违规次数最少的节点。

b.选择具有最低优先级受害者的节点。

c.如果有多个节点,则选择被所有受害者的优先级之和最低的节点。

d.如果有多个节点,则选择受害者人数最少的节点。

e.如果有多个节点,则选择所有最高优先级受害者的最晚开始时间的节点。

f.如果有多个节点,则选择第一个这样的节点(随机排序)。

5.在最佳候选节点上做抢占前的准备工作

a.驱逐受害者pod

b.如果受害者pod在waitingPod map中,则拒绝它们

c.如果需要,清除低优先级pod的nominatedNodeName