接上文的工作,上文是找到了scheduler的入口。接下来看scheduler具体的执行。
1
2
3
4
5
|
cmd/kube-scheduler/scheduler.go:34 main函数 ->
cmd/kube-scheduler/app/server.go:70 NewSchedulerCommand->
cmd/kube-scheduler/app/server.go:117 runCommand ->
cmd/kube-scheduler/app/server.go:167 Run ->
pkg/scheduler/scheduler.go:276 run ->
|
这是上文的工作
1
2
|
pkg/scheduler/scheduler.go:501 scheduleOne ->
pkg/scheduler/scheduler.go:291 schedule->
|
这里schedule只是一个街口,定义在 schedule/algorithm/interface中
pkg/scheduler/core/generic_scheduler.go:139 Schedule
(这一步是参考的,我具体是没有找出来,这里先存个疑,有机会补补接口这方面的知识)
1
2
3
4
5
6
7
8
9
|
func (g *genericScheduler) Schedule(pod *v1.Pod, nodeLister algorithm.NodeLister) (string, error) {
nodes, err := nodeLister.List()
trace.Step("Computing predicates")
filteredNodes, failedPredicateMap, err := g.findNodesThatFit(pod, nodes)
trace.Step("Prioritizing")
priorityList, err := PrioritizeNodes(pod, g.cachedNodeInfoMap, metaPrioritiesInterface, g.prioritizers, filteredNodes, g.extenders)
trace.Step("Selecting host")
return g.selectHost(priorityList)
}
|
这是函数的主要内容,可以出来调度的顺序了。
先用findNodesThatFit删选出不合适的,然后PrioritizeNodes进行打分,最后selectHost选出来一个最好的。
findNodesThatFit,PrioritizeNodes,selectHost都在pkg/scheduler/core/generic_scheduler.go中。