首页/云/Kubernetes 速查/topologySpreadConstraints 均匀分布
调度与资源52 条

topologySpreadConstraints 均匀分布

按拓扑域控制副本分布(maxSkew、whenUnsatisfiable、minDomains):比反亲和更可控地表达「尽量均匀」。

Kubernetes 速查云更新于 2026-10-13

概念定位

topologySpreadConstraints 用 maxSkew、topologyKey、whenUnsatisfiable 三个要素表达「副本在各拓扑域之间尽量均匀」,比 podAntiAffinity 更可控:它允许指定偏差上限,也可以设置参与均衡的域数量下限。适用平台是 Kubernetes(1.19 起功能稳定)。硬模式保证偏差不超标,软模式只影响打分,跨可用区容灾与节点级打散都可以用它统一表达。

基本信息

适用平台Kubernetes,Pod 级 spec.topologySpreadConstraints
关键字段maxSkew、topologyKey、whenUnsatisfiable、labelSelector、minDomains
两种模式DoNotSchedule(硬)、ScheduleAnyway(软)
默认行为minDomains 未设置时按实际存在的域计算均衡

典型使用场景

  • 跨可用区均衡:让副本均匀分布在多个 zone,单区故障影响面可控
  • 节点级打散:以 hostname 为域,避免多个副本挤在同一台机器
  • 替换硬反亲和:反亲和无法表达「偏差不超过 1」,分布约束可以
  • 多约束组合:同时按可用区与机型标签做两层分布
  • 灰度观察:先用软模式上量,确认调度结果符合预期后再转硬约束

跨可用区均衡

跨可用区均衡
spec:
  topologySpreadConstraints:
    - maxSkew: 1
      topologyKey: topology.kubernetes.io/zone
      whenUnsatisfiable: DoNotSchedule
      minDomains: 2
      labelSelector:
        matchLabels:
          app: web

核对与排查

核对与排查
kubectl get pods -l app=web -o custom-columns='NAME:.metadata.name,NODE:.spec.nodeName'
kubectl get nodes -L topology.kubernetes.io/zone            # 域的数量
kubectl describe pod web-x | grep -A8 'Topology Spread'     # 解析后的约束
kubectl get events --field-selector reason=FailedScheduling --sort-by=.lastTimestamp | tail -5

字段作用

字段作用写错后果
maxSkew各域副本数允许的偏差上限设 1 且域数不整除副本数时会有额外约束
whenUnsatisfiable硬约束或软偏好硬约束下节点不足会造成 Pending
topologyKey用什么标签划分域域标签缺失时整批无法调度
minDomains参与均衡的域数量下限设置过高时域不足会直接拒绝调度
硬模式配合 maxSkew=1 时需要预留足够的拓扑域容量,扩副本前先算出每域能放几个,否则多余副本会长时间 Pending。
同一 Pod 可以声明多条分布约束(如同时按可用区与节点),调度器需全部满足;约束越多,可用节点组合越少。

选择硬软模式的依据

  • 合规或多活架构要求副本必须跨域时用 DoNotSchedule,接受偶发 Pending
  • 只希望尽量分散、不能影响扩容的用 ScheduleAnyway,容量不足时自动退让
  • 域数量固定且容量充足时用 minDomains 明确下限,域不足会直接拒绝调度
  • 先用软模式上线观察实际分布,确认符合预期再切硬约束,避免一次性锁死调度空间

易错点

  • 硬约束 + maxSkew=1 时副本数不是域数整数倍会有额外约束,扩副本前算清楚
  • 用节点标签当 topologyKey 时各域节点数可能不同,分布均匀不等于单节点不叠放
  • topologyKey 选用的标签在部分节点上缺失:这些节点会被排除在均衡计算之外,容易出现意外的集中部署
  • minDomains 设得过大:域数量不足时硬约束会直接拒绝调度,缩容可用区前要先评估

数据来源与参考

  • Kubernetes 官方文档 · Pod 拓扑分布约束
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌