Kubernetes的调度程序如何工作?

时间:2015-03-04 15:15:46

标签: kubernetes

Kubernetes'调度工作?我的意思是Kubernetes'调度程序看起来很简单?

我最初的想法是这个调度程序只是一个简单的准入控制系统,而不是真正的调度程序。这是正确的吗?

我找到了一个简短的描述,但它并没有非常丰富的信息:

  

kubernetes调度程序是一个策略丰富,支持拓扑的,   特定于工作负载的功能会显着影响可用性   性能和容量。调度程序需要考虑   个人和集体资源要求,服务质量   要求,硬件/软件/政策约束,亲和力和   反亲和规范,数据局部性,工作负载   干扰,截止日期等。特定于工作负载的要求   将根据需要通过API公开。

2 个答案:

答案 0 :(得分:50)

您引用的段落描述了我们希望未来的位置(未来以月为单位,而不是以年为单位)。我们还没有,但调度程序确实已经有许多有用的功能,足以进行简单的部署。在本回复的其余部分中,我将解释调度程序今天的工作原理。

调度程序不仅仅是一个准入控制器;对于创建的每个pod,它会找到该pod的“最佳”机器,如果没有适合的机器,则pod将保持未调度,直到机器变得合适。

调度程序是可配置的。它有两种类型的政策, FitPredicate (请参阅master/pkg/scheduler/predicates.go)和 PriorityFunction (请参阅master/pkg/scheduler/priorities.go)。我会描述它们。

适合谓词是必需的规则,例如,节点上的标签必须与广告连播上的标签选择器兼容(此规则在PodSelectorMatches()的{​​{1}}中实施),已经在机器上运行的容器的请求资源加上您考虑安排到机器上的新容器的请求资源的总和不得大于机器的容量(这规则在predicates.go的{​​{1}}中实施;请注意,“请求的资源”定义为 pod.Spec.Containers [n] .Resources.Limits ,如果您请求为零资源然后你总是适合)。如果特定(新的pod,machine)对不满足任何所需规则,则不会在该计算机上安排新pod。如果在检查所有计算机后,调度程序决定无法将新pod安排到任何计算机上,则该pod将保持挂起状态,直到其中一台计算机满足为止。

在根据拟合谓词检查所有机器之后,调度程序可能会发现多台机器“适合”该吊舱。但是当然,pod只能安排在一台机器上。这就是优先级函数的用武之地。基本上,调度程序会对符合所有拟合谓词的计算机进行排名,然后选择最佳的谓词。例如,它更喜欢已经运行的pod消耗最少资源的计算机(这在PodFitsResources()中的predicates.go中实现)。此策略将pod(以及容器)传播出去,而不是将批次打包到一台机器上,而将其他机器留空。

当我说调度程序是可配置的时,我的意思是你可以在编译时决定哪些符合你希望Kubernetes应用的谓词和优先级函数。目前,它适用于您在LeastRequestedPriority()priorities.go中看到的所有内容。

答案 1 :(得分:7)

我们已经完成了自定义,例如,基于自定义选择器应用多级关联和反关联。调度程序并不完美,但它对大多数服务级别的工作负载都相当不错,并且将来应该会好很多。 https://docs.openshift.org/latest/admin_guide/scheduler.html#use-cases描述了一个特定的Kube调度程序配置,它提供了这个。