Kubernetes 的调度器是如何工作的?
How does Kubernetes' scheduler work?
Kubernetes 的调度器是如何工作的?我的意思是Kubernetes的调度器看起来很简单?
我最初的想法是这个调度器只是一个简单的准入控制系统,而不是真正的调度器。是这样吗?
我找到了一个简短的描述,但信息量不大:
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.
您引用的段落描述了我们希望在未来达到的目标(未来是以月为单位而不是以年为单位定义的)。我们还没有做到这一点,但调度程序确实已经具有许多有用的功能,足以进行简单的部署。在本回复的其余部分,我将解释今天调度程序的工作原理。
调度器不仅仅是一个准入控制器;对于创建的每个 pod,它会为该 pod 找到 "best" 机器,如果没有合适的机器,该 pod 将保持未调度状态,直到有一台机器变得合适。
调度程序是可配置的。它有两种类型的策略,FitPredicate(参见 master/pkg/scheduler/predicates.go
)和 PriorityFunction(参见 master/pkg/scheduler/priorities.go
)。我来描述一下。
Fit predicates是必须的规则,比如node上的labels必须和pod上的label selector兼容(这个规则在PodSelectorMatches()
中实现predicates.go
),并且机器上已经 运行 的容器请求的资源加上您正在考虑调度到机器上的新容器的请求资源之和不得大于机器的容量(此规则在predicates.go
中的PodFitsResources()
中实现;注意"requested resources"定义为pod.Spec.Containers[n].Resources.Limits,如果您请求零资源,那么您总是适合)。如果特定(新 pod、机器)对不满足任何必需的规则,则不会在该机器上安排新 pod。如果在检查所有机器后,调度器决定新的 pod 不能被调度到任何机器上,那么该 pod 将保持 Pending 状态,直到它可以被其中一台机器满足。
在根据适合谓词检查所有机器后,调度程序可能会发现多台机器 "fit" pod。但是当然,pod 只能被调度到一台机器上。这就是优先级函数发挥作用的地方。基本上,调度程序对满足所有适合谓词的机器进行排名,然后选择最好的一台。例如,它更喜欢已经 - 运行 pods 消耗最少资源的机器(这在 priorities.go
中的 LeastRequestedPriority()
中实现)。该策略将 pods(以及容器)展开,而不是将批次打包到一台机器上,同时让其他机器空着。
当我说调度程序是可配置的时,我的意思是您可以在编译时决定您希望 Kubernetes 应用哪些适合的谓词和优先级函数。目前,它适用于您在 predicates.go
和 priorities.go
.
中看到的所有内容
我们已经完成了自定义,例如,基于自定义选择器应用多级亲和力和反亲和力。调度程序并不完美,但它对于大多数服务级别的工作负载来说非常好,并且在未来应该会变得更好。 https://docs.openshift.org/latest/admin_guide/scheduler.html#use-cases 描述了一种特定的 Kube 调度程序配置,它提供了这一点。
Kubernetes 的调度器是如何工作的?我的意思是Kubernetes的调度器看起来很简单?
我最初的想法是这个调度器只是一个简单的准入控制系统,而不是真正的调度器。是这样吗?
我找到了一个简短的描述,但信息量不大:
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.
您引用的段落描述了我们希望在未来达到的目标(未来是以月为单位而不是以年为单位定义的)。我们还没有做到这一点,但调度程序确实已经具有许多有用的功能,足以进行简单的部署。在本回复的其余部分,我将解释今天调度程序的工作原理。
调度器不仅仅是一个准入控制器;对于创建的每个 pod,它会为该 pod 找到 "best" 机器,如果没有合适的机器,该 pod 将保持未调度状态,直到有一台机器变得合适。
调度程序是可配置的。它有两种类型的策略,FitPredicate(参见 master/pkg/scheduler/predicates.go
)和 PriorityFunction(参见 master/pkg/scheduler/priorities.go
)。我来描述一下。
Fit predicates是必须的规则,比如node上的labels必须和pod上的label selector兼容(这个规则在PodSelectorMatches()
中实现predicates.go
),并且机器上已经 运行 的容器请求的资源加上您正在考虑调度到机器上的新容器的请求资源之和不得大于机器的容量(此规则在predicates.go
中的PodFitsResources()
中实现;注意"requested resources"定义为pod.Spec.Containers[n].Resources.Limits,如果您请求零资源,那么您总是适合)。如果特定(新 pod、机器)对不满足任何必需的规则,则不会在该机器上安排新 pod。如果在检查所有机器后,调度器决定新的 pod 不能被调度到任何机器上,那么该 pod 将保持 Pending 状态,直到它可以被其中一台机器满足。
在根据适合谓词检查所有机器后,调度程序可能会发现多台机器 "fit" pod。但是当然,pod 只能被调度到一台机器上。这就是优先级函数发挥作用的地方。基本上,调度程序对满足所有适合谓词的机器进行排名,然后选择最好的一台。例如,它更喜欢已经 - 运行 pods 消耗最少资源的机器(这在 priorities.go
中的 LeastRequestedPriority()
中实现)。该策略将 pods(以及容器)展开,而不是将批次打包到一台机器上,同时让其他机器空着。
当我说调度程序是可配置的时,我的意思是您可以在编译时决定您希望 Kubernetes 应用哪些适合的谓词和优先级函数。目前,它适用于您在 predicates.go
和 priorities.go
.
我们已经完成了自定义,例如,基于自定义选择器应用多级亲和力和反亲和力。调度程序并不完美,但它对于大多数服务级别的工作负载来说非常好,并且在未来应该会变得更好。 https://docs.openshift.org/latest/admin_guide/scheduler.html#use-cases 描述了一种特定的 Kube 调度程序配置,它提供了这一点。