作者信息:https://home.cnblogs.com/u/huangjiabobk

在K8S中,Scheduler使用哪两种算法将 Pod 绑定到 worker节点?

在 Kubernetes 中,Scheduler 负责将 Pod 绑定到集群中的节点上。Scheduler 使用一系列的算法和策略来决定 Pod 应该被调度到哪个节点上。虽然 Scheduler 的决策过程涉及多种算法和策略,但从总体上看,可以将其主要决策过程归纳为两类算法:预选(Predication)和选择(Scheduling)。

1. 预选(Predication)

预选是指 Scheduler 在正式选择节点之前,先判断集群中的哪些节点满足 Pod 的要求。这一阶段主要是为了过滤掉不符合条件的节点。预选算法包括但不限于以下几个方面:

  • 资源可用性:检查节点是否有足够的资源(如 CPU、内存、磁盘空间等)来运行 Pod。
  • 节点标签和污点:检查节点标签是否符合 Pod 的节点选择器(NodeSelector);同时,如果节点上有 Pod 不能容忍的污点(Taints),则该节点也会被排除在外。
  • 亲和性和反亲和性:检查节点是否满足 Pod 的亲和性(Affinity)和反亲和性(Anti-affinity)设置。
  • 节点条件:检查节点是否处于就绪(Ready)状态,以及是否满足其他健康检查条件。
  • 安全策略:检查节点是否满足 Pod 的安全上下文要求,例如 SELinux 标签等。
2. 选择(Scheduling)

一旦预选阶段完成,只剩下符合条件的节点之后,Scheduler 会使用选择算法来决定哪个节点是最优的选择。选择算法通常会考虑以下因素:

  • 节点资源利用率:选择资源利用率较低的节点,以避免过度集中负载。
  • 节点亲和性:如果 Pod 设置了节点亲和性规则,Scheduler 会选择那些能够满足这些规则的节点。
  • 优先级:优先级较高的 Pod 可能会被优先调度到合适的节点上。
  • 优先级抢占:如果高优先级的 Pod 需要资源而低优先级的 Pod 正在占用这些资源,Scheduler 可能会选择抢占低优先级 Pod 的资源。
  • 拓扑感知调度:根据节点的拓扑信息(如机架、区域等)来做出决策,以提高系统的容错能力和可用性。
  • 负载均衡:尝试将 Pod 均匀分布在不同的节点上,以防止某一个节点的负载过高。
3. 实现细节

在 Kubernetes 的实现中,Scheduler 使用了插件化的框架,允许用户通过自定义的 Predicate 和 Prioritizer 插件来扩展调度逻辑。这些插件可以注册到 Scheduler 中,并参与到预选和选择的过程中。例如,用户可以编写自定义的插件来实现更复杂的调度逻辑,如基于性能的调度、基于成本的调度等。

此外,Scheduler 还支持多种内置的调度策略,如:

  • LeastAllocated:选择当前资源最少使用的节点。
  • MostBooted:选择启动时间最长的节点。
  • Random:随机选择一个节点。

综上所述,通过这些算法和策略的组合,Scheduler 能够根据集群的当前状态和 Pod 的需求来做出最优的调度决策。

posted @ 2024-08-17 23:54  黄嘉波  阅读(7)  评论(0编辑  收藏  举报
版权声明:原创作品,谢绝转载!否则将追究法律责任。--作者 黄嘉波