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 选择节点
- 过滤
- 打分
过滤(Filtering)步骤会找到一组可行的 Node 来调度 Pod。例如,PodFitsResources 过滤器会检查候选 Node 是否有足够的可用资源来满足 Pod 的特定资源请求。此步骤之后,节点列表将包含任何合适的 Node;通常,会有不止一个。如果列表为空,则该 Pod(目前)无法调度。
在打分(Scoring)步骤中,调度器对剩余节点进行排序,以选择最适合 Pod 放置的节点。调度器根据活跃的打分规则为通过过滤的每个 Node 分配一个分数。
最后,kube-scheduler 将 Pod 分配给得分最高的 Node。如果多个节点的得分相同,kube-scheduler 会随机选择其中一个。
有两种支持的方式可以配置调度器的过滤和打分行为
- 调度策略(Scheduling Policies)允许你配置用于过滤的谓词(Predicates)和用于打分的优先级(Priorities)。
- 调度配置(Scheduling Profiles)允许你配置实现不同调度阶段的插件,包括:
QueueSort
,Filter
,Score
,Bind
,Reserve
,Permit
等。你还可以配置 kube-scheduler 运行不同的配置文件。
下一步
- 阅读有关调度器性能调优的内容
- 阅读有关Pod 拓扑分布约束的内容
- 阅读 kube-scheduler 的参考文档
- 阅读 kube-scheduler config (v1) 参考
- 了解如何配置多个调度器
- 了解拓扑管理策略
- 了解Pod 开销
- 了解使用 Volume 的 Pod 的调度,请参阅