Kubernetes 使用哪种算法将 Pod 分配给节点?

时间:2021-07-20 09:28:34

标签: algorithm kubernetes dynamic-programming graph-algorithm hungarian-algorithm

这更多是成本估算问题,而不是如何使用节点亲和性等功能。

所以基本上有 m pods 有一些限制,例如:

  • 特定 Deployments / StatefulSets 的每个 pod 应该在不同的 kubernetes 节点上
  • 特定 Deployments / StatefulSets 的 Pod 应该在 3 个可用区上保持平衡

现在,我想找出我需要托管多少个节点(所有类型相同)给定的 Deployments / StatefulSets 集。

我最初认为这更像是使用匈牙利算法解决的分配问题,但这在多维约束等术语中似乎要复杂得多。

3 个答案:

答案 0 :(得分:2)

Kubernetes 根据许多约束来分配 Pod,例如

  • 资源需求
  • 资源存在(节点容量)
  • 节点选择器(如果有)或 Affinity 规则
  • 关联权重规则

这是一篇很好的文章:https://kubernetes.io/docs/concepts/scheduling-eviction/kube-scheduler/

还有:https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/

我建议阅读:https://kubernetes.io/docs/concepts/scheduling-eviction/

答案 1 :(得分:2)

据我所知,kube-scheduler 默认使用的算法在 github here 上有描述。

它解释了它是如何工作的。它首先过滤不满足 Pod 要求的节点,例如资源请求 > 节点上的可用资源、亲和性等

然后使用排序算法来确定最佳拟合节点。想要更深入地了解

答案 2 :(得分:1)

参考用户 Harsh Manvar 的非常好的回答,我将补充一些我自己的信息。正如我的前任所描述的那样,该主题已在 documentation 中进行了介绍。除了她,你还可以找到非常好的材料here

<块引用>

在 Kubernetes 集群上创建 Pod 时会发生什么? 在几秒钟内,Pod 就会在其中一个集群节点上启动并运行。然而,在那几秒钟内发生了很多事情。来看看:

  1. 在扫描 API 服务器(它一直在做)时,Kubernetes 调度程序检测到有一个没有 nodeName 参数的新 Pod。 nodeName 显示哪个节点应该拥有这个 Pod。
  2. 调度程序为这个 Pod 选择一个合适的节点,并使用节点名称(通过 nodeName 参数)更新 Pod 定义。
  3. 所选节点上的 kubelet 会收到通知,表明有一个 Pod 正在等待执行。
  4. kubelet 执行 Pod,后者开始在节点上运行。

您还可以找到有关调度过程和调度程序算法的tutorial