调度器性能调优
Kubernetes v1.14 [测试版]
kube-scheduler 是 Kubernetes 默认的调度器。它负责将 Pod 放置到集群中的节点上。
集群中满足 Pod 调度要求的节点称为 Pod 的*可行*节点。调度器会为 Pod 找到可行的节点,然后运行一组函数对可行节点进行评分,选择可行节点中得分最高的节点来运行 Pod。然后,调度器会在一个称为*绑定*的过程中将此决定通知 API 服务器。
本页介绍了与大型 Kubernetes 集群相关的性能调优优化。
在大型集群中,您可以调整调度器的行为,在延迟(快速放置新 Pod)和准确性(调度器很少做出糟糕的放置决策)之间平衡调度结果。
您可以通过 kube-scheduler 设置 percentageOfNodesToScore
来配置此调整设置。此 KubeSchedulerConfiguration 设置确定了集群中调度节点的阈值。
设置阈值
percentageOfNodesToScore
选项接受 0 到 100 之间的整数数值。值 0 是一个特殊数字,表示 kube-scheduler 应使用其编译后的默认值。如果您将 percentageOfNodesToScore
设置为大于 100,则 kube-scheduler 的行为就像您设置的值为 100 一样。
要更改该值,请编辑 kube-scheduler 配置文件,然后重新启动调度器。在许多情况下,配置文件位于 /etc/kubernetes/config/kube-scheduler.yaml
。
进行此更改后,您可以运行
kubectl get pods -n kube-system | grep kube-scheduler
以验证 kube-scheduler 组件是否正常。
节点评分阈值
为了提高调度性能,kube-scheduler 可以在找到足够多的可行节点后停止查找。在大型集群中,与考虑每个节点的朴素方法相比,这节省了时间。
您可以将足够多的节点数量的阈值指定为集群中所有节点总数的整数百分比。kube-scheduler 会将其转换为节点的整数数量。在调度过程中,如果 kube-scheduler 已经识别出足够多的可行节点以超过配置的百分比,则 kube-scheduler 会停止搜索更多可行节点,并进入 评分阶段。
调度器如何迭代节点 部分详细描述了该过程。
默认阈值
如果您没有指定阈值,Kubernetes 会使用线性公式计算一个数字,该公式在 100 个节点的集群中产生 50%,在 5000 个节点的集群中产生 10%。自动值的最低限度为 5%。
这意味着,无论集群有多大,kube-scheduler 始终至少对集群的 5% 进行评分,除非您已将 percentageOfNodesToScore
显式设置为小于 5。
如果您希望调度器对集群中的所有节点进行评分,请将 percentageOfNodesToScore
设置为 100。
示例
以下是一个将 percentageOfNodesToScore
设置为 50% 的示例配置。
apiVersion: kubescheduler.config.k8s.io/v1alpha1
kind: KubeSchedulerConfiguration
algorithmSource:
provider: DefaultProvider
...
percentageOfNodesToScore: 50
调整 percentageOfNodesToScore
percentageOfNodesToScore
必须是 1 到 100 之间的值,默认值根据集群大小计算。还有一个硬编码的最小值 100 个节点。
注意
在可行节点少于 100 个的集群中,调度器仍然会检查所有节点,因为没有足够多的可行节点来提前停止调度器的搜索。
在小型集群中,如果您为 percentageOfNodesToScore
设置了一个较低的值,则您的更改将不起作用或作用很小,原因类似。
如果您的集群有几百个或更少的节点,请将此配置选项保留为其默认值。进行更改不太可能显著提高调度器的性能。
设置此值时要考虑的一个重要细节是,当检查集群中较少数量的节点的可行性时,某些节点不会被发送到给定 Pod 的评分阶段。因此,对于运行给定 Pod 来说,可能得分更高的节点甚至可能不会传递到评分阶段。这将导致 Pod 的放置不太理想。
您应该避免将 percentageOfNodesToScore
设置得过低,以便 kube-scheduler 不会频繁地做出糟糕的 Pod 放置决策。避免将百分比设置为低于 10% 的任何值,除非调度器的吞吐量对您的应用程序至关重要,并且节点的得分并不重要。换句话说,您更希望在任何节点上运行 Pod,只要它是可行的。
调度器如何迭代节点
本节面向那些希望了解此功能的内部细节的人员。
为了使集群中的所有节点都有公平的机会被考虑用于运行 Pod,调度器会以循环方式迭代节点。您可以想象节点在一个数组中。调度器从数组的开头开始,检查节点的可行性,直到找到 percentageOfNodesToScore
指定的足够多的节点。对于下一个 Pod,调度器从检查上一个 Pod 的节点可行性时停止的节点数组中的点继续。
如果节点位于多个区域中,则调度器会迭代各个区域中的节点,以确保在可行性检查中考虑来自不同区域的节点。例如,考虑两个区域中的六个节点
Zone 1: Node 1, Node 2, Node 3, Node 4
Zone 2: Node 5, Node 6
调度器按以下顺序评估节点的可行性
Node 1, Node 5, Node 2, Node 6, Node 3, Node 4
遍历所有节点后,它会返回到节点 1。