Kubernetes 的 Pod 拓扑分布策略是一种调度约束机制,用来控制同一组 Pod 在集群拓扑域之间的分布均匀程度。它主要解决多副本应用集中落在少数节点或可用区的问题,从而降低单点故障带来的风险。

为什么需要 Pod 拓扑分布策略
在没有分布策略时,调度器只保证资源够用,不保证打散。假设集群有 3 个节点,部署 6 个副本,可能 5 个都调度到 node-1。一旦 node-1 宕机,服务几乎不可用。拓扑分布策略通过 topologySpreadConstraints 字段显式描述期望的分布方式。
核心字段说明
一个典型的拓扑分布约束包含以下关键字段:
- maxSkew:允许的最大倾斜数,即不同拓扑域中 Pod 数量差值的上限。
- topologyKey:节点标签的键,用来划分拓扑域,如 zone、hostname。
- whenUnsatisfiable:当不满足约束时的动作,DoNotSchedule 或 ScheduleAnyway。
- labelSelector:选定受约束的 Pod 集合。
配置示例
下面示例要求带有 app=web 标签的 Pod 按节点 hostname 打散,最大倾斜为 1:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
replicas: 6
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
topologySpreadConstraints:
- maxSkew: 1
topologyKey: kubernetes.io/hostname
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app: web
containers:
- name: nginx
image: nginx:1.25
多拓扑域组合
可以同时配置多条约束,例如既按 zone 又按 hostname 分布:
topologySpreadConstraints:
- maxSkew: 2
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: ScheduleAnyway
labelSelector:
matchLabels:
app: web
- maxSkew: 1
topologyKey: kubernetes.io/hostname
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app: web
与亲和性区别
Pod 亲和性用来把 Pod 拉近或推远,而拓扑分布策略关注数量的均衡。实际生产中常把两者配合:用亲和性隔离关键服务,用拓扑分布策略提升整体容灾能力。
注意事项
使用时应确保节点带有正确的拓扑标签,否则拓扑域无法识别。另外 maxSkew 过小可能导致无法调度,需要结合副本数和节点数权衡。
KubernetesPod_topology_spread调度策略修改时间:2026-07-28 01:51:18