抢占相关的配置介绍
PDB(Pod Disruption Budget):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