sched.SchedulingQueue.Run
定时:flushBackoffQCompleted
定时:flushUnschedulableQLeftover
开始调度:sched.scheduleOne
获取调度pod:sched.NextPod
通过pod获取调度框架:frameworkForPod
调度时跳过特殊的pod
创建周期状态:CycleState
执行调度算法:sched.Algorithm.Schedule
更新node快照:snapshot
全量更新:updateNodeInfoSnapshotList
筛选node: findNodesThatFitPod
Prefilter插件:RunPreFilterPlugins
pod提名node检查:PreferNominatedNode
findNodesThatPassFilters
没有filter插件:返回所有node
node筛选:checkNode
Filter插件:RunFilterPluginsWithNominatedPods
第一次:返回指定node上大于或等于当前pod优先级的podaddNominatedPods
第二次:传入的nodeinfo里不包含提名pod
重新计算nextStartNodeIndex
调用插件扩展:findNodesThatPassExtenders
如果筛选node为0,返回FitError
节点打分:prioritizeNodes
没有Score插件:所有node分数都为1
PreScore插件:RunPreScorePlugins
Score插件:RunScorePlugins
统计所有打分插件分数
按分数或得最高分:selectHost
调度算法抛出错误
FitError:没有找到合适node,执行PostFilter插件
默认批准插件:DefaultPreemption
通过informer更新pod的详细信息
检查pod是否可以抢占其他pod:PodEligibleToPreemptOthers
获取当前快照里的节点信息,整个周期中都不会变化:SnapshotSharedLister().NodeInfos()
检查pod是否有提名Node
子主题 3
找出所有的抢占候选node:
findCandidates
获取潜在node:node上插件执行状态不是不可调度nodesWherePreemptionMightHelp
在候选node中随机获取一个偏移量准备尝试抢占模拟
抢占模拟:DryRunPreemption
从node中寻找被抢占的pod:
SelectVictimsOnNode
更新node状态
node快照没有node:只上报日志
recordSchedulingFailure
调度Error函数:MakeDefaultErrorFunc
将传入的提名node记录到 PodNominator中<br>AddNominatedPod
发布pod调度失败事件
修改pod的状态字段,有提名node,则修改status中的NominatedNodeName
假设pod绑定node成功:sched.assume
Reserve插件:RunReservePluginsReserve
Premit插件:RunPermitPlugins
pod重新推入activeQ,由插件决定
绑定周期——Permit插件:WaitOnPermit
执行失败:RunReservePluginsUnreserve
cache. ForgetPod
绑定周期——PreBind插件:RunPreBindPlugins
执行失败:RunReservePluginsUnreserve
cache. ForgetPod
绑定周期——Bind插件
执行成功——插件PostBind:RunPostBindPlugins
执行失败:RunReservePluginsUnreserve
cache. ForgetPod