Kubernetes的调度程序如何工作?

Hal*_*acs 33 kubernetes

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

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

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

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

小智 52

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

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

调度程序是可配置的.它有两种类型的策略,FitPredicate(请参阅参考资料master/pkg/scheduler/predicates.go)和PriorityFunction(参见参考资料master/pkg/scheduler/priorities.go).我会形容他们.

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

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

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

  • 那么两年后你是否达到了你在答案开始时提到的预期目标? (4认同)
  • 链接现在是 https://github.com/kubernetes/community/blob/master/contributors/devel/sig-scheduling/scheduler.md 和 https://github.com/kubernetes/community/blob/master/contributors/开发/sig-scheduling/scheduler_algorithm.md (2认同)
  • @AndrewRalon 看起来像 https://github.com/kubernetes/community/blob/master/contributors/devel/sig-scheduling/scheduling_code_hierarchy_overview.md 是新的 (2认同)

Cla*_*ton 7

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