更具指定的topologyKey可以将节点划分到拓扑结构中去,这种拓扑结构可以实现pod间的亲和和反亲和的关键所在,但是pod的亲和调度仅能将相关的pod分发到相关的单个拓扑中。并且其无法做到均匀的将pod分散到其他拓扑中。

如果我们要将某组pod均匀分布到多个不同的拓扑中去运行,那么我们需要让其去识别多个不同的位置。而拓扑分布式调度不经能实现将pod分散到不同的pod中去还能均匀的让其分布到所有的拓扑中去。

拓扑分布式调度资源定义规范

Pod资源规范中的拓扑分布约束嵌套定义在.spec.topologySpreadConstraints字`段中,它用来指示调度器如何根据集群中现有的Pod放置待调度的该Pod规范的实例。

1
2
3
4
topologyKey <string>:拓扑键,用来划分拓扑结构的节点标签,在指定的键上具有相同值的节点归属为同一拓扑;必选字段。
labelSelector <Object>:Pod标签选择器,用于定义该Pod需要针对哪类Pod对象的位置来确定自身可放置的位置。
maxSkew <integer>:允许Pod分布不均匀的最大程度,也就是可接受的当前拓扑中由labelSelector匹配到的Pod数量与所有拓扑中匹配到的最少Pod数量的最大差值,可简单用公式表示为max(count(current_topo(matched_pods))-min(topo(matched_pods))),其中的topo是表示拓扑关系伪函数名称。
whenUnsatisfiable <string>:拓扑无法满足maxSkew时采取的调度策略,默认值DoNotSchedule是一种强制约束,即不予调度至该区域,而另一可用值ScheduleAnyway则是柔性约束,无法满足约束关系时仍可将Pod放入该拓扑中。