无论我如何努力调整,我都无法使 Pod 均匀分布在 AWS EKS 集群中的四个节点上。这是 Pod yaml。
nodeSelector:
node_env: my-node-name
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: node_env
operator: In
values:
- my-node-name
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- my-app-name
topologyKey: topology.kubernetes.io/hostname
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- my-app-name
topologyKey: node_env
topologySpreadConstraints:
- maxSkew: 1
nodeAffinityPolicy: Honor
topologyKey: kubernetes.io/hostname
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- my-app-name
EKS 集群下有七个节点 - 四个用于应用程序 Pod,两个用于 Envoy Pod,一个用于其他 Pod。
我希望放置一个 pod 的四个副本,并将其均匀分布在这些应用程序 pod 节点中。
虽然可以将
topologySpreadConstraints
与 podAntiAffinity/podAffinity
一起使用,但我不建议这样做。我建议您查看以下答案进行比较:
https://stackoverflow.com/a/73159361/19206466
如果您的目标是在节点之间实现均匀分布,则可以通过将
nodeAffinity
与 topologySpreadConstraints
组合来实现此目的。使用 nodeAffinity
选择适当的节点,确保您的 EKS 节点附有 node_env: my-node-name
标签。要列出节点的标签,您可以使用 kubectl describe node <eks_node>
。
然后,使用
topologySpreadConstraints
将 pod 均匀分布在这些节点上;设置 maxSkew: 1
应足以将 pod 均匀分布在选定的节点上。
此外,请确保您的应用程序 Pod 上存在 app: my-app-name
标签。
重要提示: 如果您为 EKS 集群使用自动缩放器(例如 Karpenter),您可能还需要定义自 Kubernetes 1.25 以来支持的
minDomains
topologySpreadConstraints
属性。
在您的情况下,它将定义所需 EKS 节点的最小数量。
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: node_env
operator: In
values:
- my-node-name
topologySpreadConstraints:
- maxSkew: 1
nodeAffinityPolicy: Honor
topologyKey: kubernetes.io/hostname
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app: my-app-name
参考文献