调度器性能调优

特性状态: Kubernetes v1.14 [beta]

kube-scheduler 是 Kubernetes 的默认调度器。它负责在集群中将 Pod 放置到节点上。

集群中满足 Pod 调度需求的节点被称为该 Pod 的 可调度 节点。调度器会为 Pod 找到可调度节点,然后运行一系列函数对这些可调度节点进行打分,选择分数最高的节点来运行 Pod。调度器通过一个名为 绑定 (Binding) 的过程将此决策通知 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 个节点的硬编码最小值。

设置此值时要考虑的一个重要细节是,当集群中检查可调度节点的数量较少时,有些节点不会被发送去为给定的 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。

下一步

上次修改时间:2024 年 6 月 27 日 太平洋标准时间下午 6:06:fix: minimum feasible nodes 50->100 (44460b3ee3)