调度器性能调优
Kubernetes v1.14 [beta]
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 的节点可行性时停止的节点数组中的位置继续。
如果节点位于多个区域(zones)中,调度器会迭代不同区域中的节点,以确保在可行性检查中考虑来自不同区域的节点。举例来说,考虑两个区域中的六个节点:
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。