假设我有一个这样的集群:
zoneA:
- node1: 8 CPU
zoneB:
- node2: 4 CPU
- node3: 4 CPU
zoneB 的资源总和等于zoneA 的资源总和。因此,如果我想跨区域均匀分布 foo 的 pod,我可以指定 pod 拓扑分布约束:
spec:
topologySpreadConstraints:
- maxSkew: 1
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app: foo
这将为每个区域创建一个拓扑域,并且约束将强制 pod 在 2 个区域中均匀分布。
但据我所知(如果我错了,请纠正我),这不能保证每个拓扑域内的节点之间均匀分布。例如,假设有 4 个 Pod 需要安排。为了将 pod 均匀分布在 zoneB 内,放置位置将如下所示:
node1 (8 CPU): 2 pods
node2 (4 CPU): 1 pod
node3 (4 CPU): 1 pod
但是,我不明白上述约束如何阻止这样的放置:
node1 (8 CPU): 2 pods
node2 (4 CPU): 2 pods
node3 (4 CPU): 0 pods
有什么方法可以表达一个约束,保证 pod 在 zoneB 内均匀分布,同时保持 zoneA 和 zoneB 之间的均匀分布?
除了您已有的
podAntiAffinity
之外,我还会添加“软”topologySpreadConstraints
。
spec:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
topologyKey: kubernetes.io/hostname
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- foo
调度程序将尝试将 Pod 分散到一个区域中的节点上,但不会停止它,因为您在 ZoneA 中只有一个节点。