scheduler
2021-10-14 10:13:31 16 举报
AI智能生成
根据master分支(下一个版本是1.23)阅读而成
作者其他创作
大纲/内容
NewSchedulerCommand
设置默认配置:NewOptions
https服务配置
api-server链接认证配置
api-server鉴权配置
监控配置
设置命令行传参
创建cobra.command
初始化日志组件
command.Execute()
opts.Complete
注册默认插件:latest.Default()
init函数:AddToScheme
init函数:localSchemeBuilder.Register
RegisterDefaults
scheme.Scheme.Default
收集弃用的启动参数
runCommand
查看版本:PrintAndExitIfRequested
定义退出上下文context.WithCancel
协程:捕捉信号-SetupSignalHandler
初始化:Setup
从Options初始化sched配置:opts.Config()
https服务配置
api-server认证&鉴权
kubeconfig
api-server客户端
高可用设置:选举
创建ClientSet客户端+Informer
创建动态客户端+informer
完善scheduler配置:c.Complete()
scheduler.New()
默认sched的配置:defaultSchedulerOptions
初始化schedulerCache
定时更新缓存:cleanupAssumedPods
cache.assumedPods
是否完成binding
cache.assumedPods
清理超过cache.ttl时长的缓存
创建插件注册表(合并out-tree和in-tree插件)
NewInTreeRegistry
frameworkOutOfTreeRegistry
初始化节点快照:NewEmptySnapshot
通过配置创建sched:configurator.create
创建提名队列:NewPodNominator
创建调度框架对象:profile.NewMap
newProfile——>NewFramework
获取激活的plugin:pluginsNeeded
从插件注册表中加载插件到pluginsMap
插件激活状态、重名检查
scorePlugin打分权重检查
插件初始化:factory
queueSort插件必须只有一个
bindPlugin插件至少一个
执行创建调度框架后的回调函数
创建SchedulingQueue:NewSchedulingQueue
创建调度算法:genericScheduler
添加NextPod函数:MakeNextPodFunc
添加Error函数:MakeDefaultErrorFunc
注册事件处理函数:addAllEventHandlers
已调度pod事件监听
新增:addPodToCache
修改:updatePodInCache
删除:deletePodFromCache
未调度pod事件监听
新增:addPodToSchedulingQueue
修改:updatePodInSchedulingQueue
删除:deletePodFromSchedulingQueue
node监听事件
新增:addNodeToCache
修改:updateNodeCache
删除:delectNodeFromCache
CSINode、CSIDriver、PV、PVC、SC、SVC事件监听
Run
componentconfig注册全局配置:configz.New
运行事件管理器
添加健康检查,创建http or https server
启动所有的informer
等待informer同步缓存完成
添加选举回调函数
启动leader选举
尝试获取租约
回调:选举前OnStoppedLeading
续约:renew
回调:选举后OnStoppedLeading
选举成功:sched.run
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中
AddNominatedPod
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
Kube-Scheduler
收藏
0 条评论
下一页