Kubernetes Scheduler 使用一系列算法和策略来将 Pod 绑定到适当的 worker 节点。调度过程分为两大步骤:过滤和打分。
1. 过滤(Filtering)
调度器会筛选出符合条件的节点,这些节点称为候选节点。过滤步骤使用以下条件来排除不符合条件的节点:
节点是否可达:节点必须是运行状态并且可接受新的 Pod。
资源需求:节点必须有足够的 CPU、内存和其他资源来满足 Pod 的需求。
污点和容忍:节点的污点(Taints)必须被 Pod 的容忍(Tolerations)所接受。
节点亲和性/反亲和性:节点必须符合 Pod 定义的亲和性(Affinity)或反亲和性(Anti-Affinity)规则。
Pod 亲和性/反亲和性:节点上的其他 Pod 必须符合 Pod 定义的亲和性或反亲和性规则。
其他自定义规则:用户定义的自定义调度规则也会在这个阶段被考虑。
2. 打分(Scoring)
调度器对通过过滤的节点进行打分,根据多个打分函数为每个节点赋予分数。得分最高的节点将被选为目标节点。以下是常用的打分策略:
资源利用率:优先选择那些资源利用率适中的节点,而非最空闲或最繁忙的节点。
节点亲和性:根据 Pod 的亲和性和反亲和性规则为节点打分。
拓扑感知:考虑节点的地理位置、网络拓扑等因素,为节点打分。
Pod 间关系:考虑与其他 Pod 的位置关系,为节点打分。
具体算法示例
过滤阶段示例:
假设有 3 个节点:Node1、Node2 和 Node3。Pod 需要 2 个 CPU 和 4 GB 内存。
Node1:剩余 1 个 CPU 和 4 GB 内存,不满足资源需求。
Node2:剩余 4 个 CPU 和 8 GB 内存,满足资源需求。
Node3:剩余 2 个 CPU 和 3 GB 内存,不满足内存需求。
过滤结果:Node2 是唯一符合资源需求的节点。
打分阶段示例:
假设 Node2 和 Node3 都满足资源需求,调度器会对它们打分。
Node2:资源利用率中等(50%),分数 8。
Node3:资源利用率较高(75%),分数 5。
打分结果:Node2 得分最高,Pod 将被调度到 Node2。
调度算法
调度器使用多种算法和启发式方法来进行打分和过滤。常用算法包括:
Bin Packing:尽量将 Pod 填充到现有节点,优化资源利用率。
Least Request:选择当前负载最轻的节点。
Balanced Resource Allocation:选择资源分配最均衡的节点。
Spread Constraints:将 Pod 均匀分布在不同的节点或故障域中。
Affinity/Anti-affinity:根据亲和性和反亲和性规则打分。
调度器插件
Kubernetes 1.15 引入了调度器插件机制,允许用户自定义调度逻辑。用户可以编写插件来实现自定义的过滤和打分逻辑,并将其插入调度流程中。Kubernetes Scheduler 通过过滤和打分两个主要步骤,使用多种算法和策略来将 Pod 绑定到适当的 worker 节点。调度过程考虑了资源需求、节点和 Pod 亲和性、资源利用率等因素,以确保集群的高效和可靠运行。




