scheduler
2021-10-14 10:13:31 16 举报
AI智能生成
登录查看完整内容
根据master分支(下一个版本是1.23)阅读而成
作者其他创作
大纲/内容
https服务配置
api-server链接认证配置
api-server鉴权配置
监控配置
设置默认配置:NewOptions
设置命令行传参
创建cobra.command
NewSchedulerCommand
初始化日志组件
RegisterDefaults
init函数:localSchemeBuilder.Register
init函数:AddToScheme
scheme.Scheme.Default
注册默认插件:latest.Default()
收集弃用的启动参数
opts.Complete
查看版本:PrintAndExitIfRequested
定义退出上下文context.WithCancel
协程:捕捉信号-SetupSignalHandler
api-server认证&鉴权
kubeconfig
api-server客户端
高可用设置:选举
创建ClientSet客户端+Informer
创建动态客户端+informer
从Options初始化sched配置:opts.Config()
完善scheduler配置:c.Complete()
默认sched的配置:defaultSchedulerOptions
cache.assumedPods是否完成binding
cache.assumedPods清理超过cache.ttl时长的缓存
定时更新缓存:cleanupAssumedPods
初始化schedulerCache
NewInTreeRegistry
frameworkOutOfTreeRegistry
创建插件注册表(合并out-tree和in-tree插件)
初始化节点快照:NewEmptySnapshot
创建提名队列:NewPodNominator
获取激活的plugin:pluginsNeeded
从插件注册表中加载插件到pluginsMap
插件激活状态、重名检查
scorePlugin打分权重检查
插件初始化:factory
queueSort插件必须只有一个
bindPlugin插件至少一个
执行创建调度框架后的回调函数
newProfile——>NewFramework
创建调度框架对象:profile.NewMap
创建SchedulingQueue:NewSchedulingQueue
创建调度算法:genericScheduler
添加NextPod函数:MakeNextPodFunc
添加Error函数:MakeDefaultErrorFunc
通过配置创建sched:configurator.create
新增:addPodToCache
修改:updatePodInCache
删除:deletePodFromCache
已调度pod事件监听
新增:addPodToSchedulingQueue
修改:updatePodInSchedulingQueue
删除:deletePodFromSchedulingQueue
未调度pod事件监听
新增:addNodeToCache
修改:updateNodeCache
删除:delectNodeFromCache
node监听事件
CSINode、CSIDriver、PV、PVC、SC、SVC事件监听
注册事件处理函数:addAllEventHandlers
scheduler.New()
初始化:Setup
componentconfig注册全局配置:configz.New
运行事件管理器
添加健康检查,创建http or https server
等待informer同步缓存完成
启动所有的informer
回调:选举前OnStoppedLeading
续约:renew
回调:选举后OnStoppedLeading
尝试获取租约
启动leader选举
添加选举回调函数
定时:flushBackoffQCompleted
定时:flushUnschedulableQLeftover
sched.SchedulingQueue.Run
获取调度pod:sched.NextPod
通过pod获取调度框架:frameworkForPod
调度时跳过特殊的pod
创建周期状态:CycleState
全量更新:updateNodeInfoSnapshotList
更新node快照:snapshot
Prefilter插件:RunPreFilterPlugins
pod提名node检查:PreferNominatedNode
没有filter插件:返回所有node
第一次:返回指定node上大于或等于当前pod优先级的podaddNominatedPods
第二次:传入的nodeinfo里不包含提名pod
Filter插件:RunFilterPluginsWithNominatedPods
node筛选:checkNode
重新计算nextStartNodeIndex
findNodesThatPassFilters
调用插件扩展:findNodesThatPassExtenders
筛选node: findNodesThatFitPod
如果筛选node为0,返回FitError
没有Score插件:所有node分数都为1
PreScore插件:RunPreScorePlugins
Score插件:RunScorePlugins
统计所有打分插件分数
按分数或得最高分:selectHost
节点打分:prioritizeNodes
执行调度算法:sched.Algorithm.Schedule
通过informer更新pod的详细信息
获取当前快照里的节点信息,整个周期中都不会变化:SnapshotSharedLister().NodeInfos()
检查pod是否有提名Node
子主题 3
检查pod是否可以抢占其他pod:PodEligibleToPreemptOthers
获取潜在node:node上插件执行状态不是不可调度nodesWherePreemptionMightHelp
找出所有的抢占候选node:findCandidates
在候选node中随机获取一个偏移量准备尝试抢占模拟
从node中寻找被抢占的pod:SelectVictimsOnNode
更新node状态
抢占模拟:DryRunPreemption
默认批准插件:DefaultPreemption
FitError:没有找到合适node,执行PostFilter插件
node快照没有node:只上报日志
调度Error函数:MakeDefaultErrorFunc
将传入的提名node记录到 PodNominator中AddNominatedPod
发布pod调度失败事件
修改pod的状态字段,有提名node,则修改status中的NominatedNodeName
recordSchedulingFailure
调度算法抛出错误
假设pod绑定node成功:sched.assume
Reserve插件:RunReservePluginsReserve
Premit插件:RunPermitPlugins
pod重新推入activeQ,由插件决定
执行失败:RunReservePluginsUnreservecache. ForgetPod
绑定周期——Permit插件:WaitOnPermit
绑定周期——PreBind插件:RunPreBindPlugins
执行成功——插件PostBind:RunPostBindPlugins
绑定周期——Bind插件
开始调度:sched.scheduleOne
选举成功:sched.run
Run
runCommand
command.Execute()
Kube-Scheduler
主函数:main
![scheduler](https://www.processon.com/chart_image/template/thumb/61d596f57621316a747aefff.png?tid=616791821efad41d825697af)
收藏
0 条评论
回复 删除
下一页