我试图在所有区域均匀分布pod,但无法使其正常工作。
在k8s集群中,节点分布在3个az中。现在假设最小节点数是1,现在有2个节点,第一个节点完全是pod。现在,当我创建一个部署(副本2)与拓扑扩展约束作为ScheduleAnyway
,然后因为第二个节点有足够的资源,两个pod都部署在该节点。我不想那样。我试着把条件改为DoNotSchedule
。但是由于我只有3个az,我只能安排3个pod,并且它为所有3个pod触发新节点。我想确保relpica's分布在所有az中。
这是部署规范的一个片段。有人知道应该怎么做吗?
topologySpreadConstraints:
- maxSkew: 1
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: ScheduleAnyway
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- "my-app"
你需要调整属性max skew
给属性赋一个更高的值
参考下面给出的例子:
https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/
如果我很好地理解你的问题,你可以使用node Affinity
规则和maxSkew
字段。
请看看我的答案,或者看看下面。在这篇文章中,我描述了如何强制pod在节点之间进行拆分。您所需要做的就是在matchExpressions
部分中相应地设置key
和value
参数。此外,您可能会发现requiredDuringSchedulingIgnoredDuringExecution
字段和preferredDuringSchedulingIgnoredDuringExecution
字段非常有用。
看这个示例yaml文件:
spec:
topologySpreadConstraints:
- maxSkew: 1
topologyKey: kubernetes.io/hostname
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
example: app
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- worker-1
- worker-2
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 50
preference:
matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- worker-1
配置思路:我在这里使用nodeAffinity来指示pod可以放置在哪些节点上:
- key: kubernetes.io/hostname
和
values:
- worker-1
- worker-2
设置以下行很重要:
- maxSkew: 1
根据文档:
maxSkew描述pod可能不均匀分布的程度。必须大于0
由于此,节点之间分配的提要数量的差异将始终最大等于1。
本节:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 50
preference:
matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- worker-1
是可选的,但是,它将允许您更好地调整免费节点上的提要分布。您可以在这里找到requiredDuringSchedulingIgnoredDuringExecution
和preferredDuringSchedulingIgnoredDuringExecution
之间的差异的描述:
因此,
requiredDuringSchedulingIgnoredDuringExecution
的一个示例将是"仅在带有英特尔cpu的节点上运行pod";一个例子preferredDuringSchedulingIgnoredDuringExecution
将是"尝试在故障区XYZ中运行这组pod,但如果不可能,那么允许一些在其他地方运行"。