Kubernetes 调度器

在 Kubernetes 中,调度是指确保 Pod 匹配到 Node 上,以便 Kubelet 可以运行它们。

调度概述

调度器监测新创建的、尚未分配 Node 的 Pod。对于调度器发现的每一个 Pod,调度器负责找到最适合该 Pod 运行的 Node。调度器在做出此放置决策时会考虑下述调度原则。

如果你想了解 Pod 为什么会被放置到特定的 Node 上,或者如果你计划自己实现一个自定义调度器,本页面将帮助你了解调度。

kube-scheduler

kube-scheduler 是 Kubernetes 的默认调度器,作为控制平面的一部分运行。kube-scheduler 的设计宗旨是,如果你愿意并且需要,可以编写自己的调度组件并替代它。

Kube-scheduler 选择最佳节点来运行新创建的或尚未调度 (unscheduled) 的 Pod。由于 Pod 中的容器以及 Pod 本身可能有不同的要求,调度器会过滤掉任何不满足 Pod 特定调度需求的节点。或者,API 允许你在创建 Pod 时为其指定节点,但这不常见,仅在特殊情况下才这样做。

在集群中,满足 Pod 调度要求的 Node 被称为可行的(feasible)节点。如果没有节点合适,Pod 将保持未调度状态,直到调度器能够将其放置。

调度器为 Pod 找到可行的 Node,然后运行一系列函数对这些可行的 Node 进行评分,并在其中选择得分最高的 Node 来运行该 Pod。调度器随后通过一个称为绑定(binding)的过程将此决策通知 API 服务器。

调度决策需要考虑的因素包括个体和集体资源需求、硬件/软件/策略约束、亲和性和反亲和性规范、数据本地性、工作负载间干扰等等。

kube-scheduler 中的节点选择

kube-scheduler 通过两步操作为 Pod 选择节点

  1. 过滤
  2. 打分

过滤(Filtering)步骤会找到一组可行的 Node 来调度 Pod。例如,PodFitsResources 过滤器会检查候选 Node 是否有足够的可用资源来满足 Pod 的特定资源请求。此步骤之后,节点列表将包含任何合适的 Node;通常,会有不止一个。如果列表为空,则该 Pod(目前)无法调度。

打分(Scoring)步骤中,调度器对剩余节点进行排序,以选择最适合 Pod 放置的节点。调度器根据活跃的打分规则为通过过滤的每个 Node 分配一个分数。

最后,kube-scheduler 将 Pod 分配给得分最高的 Node。如果多个节点的得分相同,kube-scheduler 会随机选择其中一个。

有两种支持的方式可以配置调度器的过滤和打分行为

  1. 调度策略(Scheduling Policies)允许你配置用于过滤的谓词(Predicates)和用于打分的优先级(Priorities)
  2. 调度配置(Scheduling Profiles)允许你配置实现不同调度阶段的插件,包括:QueueSort, Filter, Score, Bind, Reserve, Permit 等。你还可以配置 kube-scheduler 运行不同的配置文件。

下一步

最后修改时间 2024 年 2 月 16 日下午 5:27 PST:修复 kube scheduler 中的拼写错误 (33dcba8aa6)