问题描述
这更多是成本估算问题,而不是如何使用节点亲和性等功能。
所以基本上有 m
pods 有一些限制,例如:
- 特定
Deployments
/StatefulSets
的每个 pod 应该在不同的 kubernetes 节点上 - 特定
Deployments
/StatefulSets
的 Pod 应该在 3 个可用区上保持平衡
现在,我想找出我需要托管多少个节点(所有类型相同)给定的 Deployments
/ StatefulSets
集。
我最初认为这更像是使用匈牙利算法解决的分配问题,但这在多维约束等术语中似乎要复杂得多。
解决方法
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/
,据我所知,kube-scheduler 默认使用的算法在 github here 上有描述。
它解释了它是如何工作的。它首先过滤不满足 Pod 要求的节点,例如资源请求 > 节点上的可用资源、亲和性等
然后使用排序算法来确定最佳拟合节点。想要更深入地了解
,参考用户 Harsh Manvar 的非常好的回答,我将补充一些我自己的信息。正如我的前任所描述的那样,该主题已在 documentation 中进行了介绍。除了她,你还可以找到非常好的材料here:
在 Kubernetes 集群上创建 Pod 时会发生什么? 在几秒钟内,Pod 就会在其中一个集群节点上启动并运行。然而,在那几秒钟内发生了很多事情。来看看:
- 在扫描 API 服务器(它一直在做)时,Kubernetes 调度程序检测到有一个没有 nodeName 参数的新 Pod。 nodeName 显示哪个节点应该拥有这个 Pod。
- 调度程序为这个 Pod 选择一个合适的节点,并使用节点名称(通过 nodeName 参数)更新 Pod 定义。
- 所选节点上的 kubelet 会收到通知,表明有一个 Pod 正在等待执行。
- kubelet 执行 Pod,后者开始在节点上运行。
您还可以找到有关调度过程和调度程序算法的tutorial。