39

How does Kubernetes' scheduler work? What I mean is that Kubernetes' scheduler appears to be very simple?

My initial thought is that this scheduler is just a simple admission control system, not a real scheduler. Is it that correct?

I found a short description, but it is not terribly informative:

The kubernetes scheduler is a policy-rich, topology-aware, workload-specific function that significantly impacts availability, performance, and capacity. The scheduler needs to take into account individual and collective resource requirements, quality of service requirements, hardware/software/policy constraints, affinity and anti-affinity specifications, data locality, inter-workload interference, deadlines, and so on. Workload-specific requirements will be exposed through the API as necessary.

4

2 回答 2

60

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

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

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

fit 谓词是必需的规则,例如节点上的标签必须与 pod 上的标签选择器兼容(此规则在PodSelectorMatches()中实现predicates.go),以及已在机器上运行的容器的请求资源总和加上您正在考虑调度到机器上的新容器的请求资源不得大于机器的容量(此规则在PodFitsResources()中实现predicates.go;请注意,“请求的资源”定义为pod.Spec.Containers [n].资源.限制,如果您请求零资源,那么您总是适合)。如果特定(新 pod、机器)对不满足任何所需规则,则不会在该机器上安排新 pod。如果在检查了所有机器之后调度器决定新的 Pod 不能被调度到任何机器上,那么 Pod 保持在 Pending 状态,直到它可以被其中一台机器满足。

在检查所有机器的适合谓词之后,调度程序可能会发现多台机器“适合”该 pod。但当然,pod 只能调度到一台机器上。这就是优先功能发挥作用的地方。基本上,调度程序对满足所有适合谓词的机器进行排名,然后选择最好的机器。例如,它更喜欢已经运行的 pod 消耗最少资源的机器(这在LeastRequestedPriority()中实现priorities.go)。该策略将 pod(以及容器)分散开来,而不是将批次打包到一台机器上,而其他机器则空着。

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

于 2015-03-05T09:42:45.610 回答
7

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

于 2015-06-24T03:58:49.600 回答