Kubernetes EKS 部署将软节点亲和力设置为拆分 pods 每个节点组 50/50

Kubernetes EKS deployment set soft node affinity to split pods 50/50 per nodegroup

我有一个 EKS cluster,有两个 nodegroups,每个都在不同的 AZ 中。一个 deployment Deployment1 在 2 namespaces 上 运行 用于冗余,每个 namespace 一个副本,每个 运行 在单独的 [=18] =]/nodegroup。还有另一个 deployment Deployment2 没有任何 node affinity 设置,K8s 管理 pods 的调度位置。 deployments 都很大,有很多 pods。我为每个节点组提供了一个包含 250 个 IP 的子网。

问题是,虽然 Deployment1 本身很好,并且每个 AZ/Nodegroup 几乎平均分配,但 Deployment2 倾向于将大多数 pods 安排在一个nodegroups 并在没有更多 IP 可用时结束。这是 Deployment1 的一个问题,因为其中一个 namespace 与那个 nodegroup 相关联,如果负载发生变化,则无法在那里安排新的 pods。

我能否以某种方式平衡 Deployment2,使其具有 'soft affinity',每个节点组将其拆分为 50/50,但如果需要,是否可以在另一个节点组中安排 pods?

如果您使用的是 Kubernetes 1.19 或更高版本,则可以使用 topologySpreadConstraints,将其添加到 pod 模板:

topologySpreadConstraints:
  - maxSkew: 1
    topologyKey: topology.kubernetes.io/zone
    whenUnsatisfiable: ScheduleAnyway
    labelSelector:
      matchLabels:
        foo: bar

其中 maxSkew 定义如何不均匀地安排 pods,topologyKey 是节点标签的键,labelSelector 匹配您部署的标签。参见 docs

如果您使用的是较旧的 Kubernetes 版本,您可以查看 pod 反亲和性。