接上文的工作,上文是找到了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中。