从零开始入门 K8s | 调度器的调度流程和算法介绍(13)

selector 选择的是所有 lable 符合 app=foo 的 pod , 必须在 zone 级别是打散的 , 允许最大不均衡数为 1 。
集群中有三个 zone , 上图中 label 的值 app=foo 的 Pod 在 zone1 和 zone2 中都分配了一个 pod 。
计算不均衡数量公式为:ActualSkew = count[topo
- min(count[topo
)
首先 , 依据 selector 获取到符合条件的 Pod 列表
其次 , 会按照 topologyKey 去分组得到 count[topo

如上图所示:

假设 maxSkew 为 1 , 如果分配到 zone1/zone2 , skew 的值为2 , 大于前面设置的 maxSkew 。 这是不匹配的 , 所以只能分配到 zone3 。 如果分配到 zone3 的话 , min(count[topo
) 为1 , count[topo
为 1 , 那 skew 就等于 0 , 因此只能分配到 zone2 。

假设 maxSkew 为 2 , 分配到 z1(z2) , skew 的值为 2/1/0(1/2/0) , 最大值为 2 , 满足 <=maxSkew 。 那 z1/z2/z3 都是允许被选择的 。

通过 EvenPodsSpread 可以实现一组 Pod 在某个 TopologyKey 上的均衡打散需求 , 如果必须要求每个 topo 上都均衡可以设 maxSkew 为1 , 当然这个描述缺乏了一些控制 , 例如必须分配在多少个 topologyValue 上的限制 。

推荐阅读