【问题标题】:Kubernetes EKS deployment set soft node affinity to split pods 50/50 per nodegroupKubernetes EKS 部署将软节点亲和性设置为将 pod 拆分为每个节点组 50/50
【发布时间】:2022-01-17 07:38:34
【问题描述】:

我有一个 EKS cluster 和两个 nodegroups,每个 AZ 不同。一个 deployment Deployment1 在 2 个 namespaces 上运行以实现冗余,每个 namespace 一个副本,每个都在单独的 AZs/nodegroup 中运行。还有另一个 deployment Deployment2 没有设置任何 node affinity 并且 K8s 管理 pod 的调度位置。 deployments 都很大,有很多豆荚。我有一个包含 250 个 IP 的子网可供每个节点组使用。

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

我能否以某种方式平衡Deployment2,使其具有“软亲和力”,可以将每个节点组按 50/50 拆分,但如果需要,可以在另一个节点组中调度 pod?

【问题讨论】:

    标签: kubernetes amazon-eks kubernetes-pod kubernetes-deployment


    【解决方案1】:

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

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

    maxSkew 定义如何调度不均匀的 pod,topologyKey 是节点标签的键,labelSelector 匹配您的部署标签。见docs

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

    【讨论】:

    • 谢谢,这很好用,正是我需要的。我还有一个问题,但我想这与问题没有直接关系。当我第一次部署 Deployment2 时,它并没有真正遵循拓扑扩展约束,因为随着新节点的出现,Pod 将转到出现的第一个节点,而不管 AZ,因为我使用的是 whenUnsatisfiable: ScheduleAnyway。然后我必须手动增加一组中的节点大小并杀死另一组中的 pod 以使它们再次平衡。
    • 最简单的方法可能是执行kubectl rollout restart deploy Deployment2,因此该部署的所有 pod 都将滚动重启,以尊重区域。这应该在不中断正在进行的流量的情况下分发它们。如果您手动增加节点,这可能只是第二步。
    猜你喜欢
    • 1970-01-01
    • 2018-05-28
    • 2019-01-14
    • 2019-11-26
    • 2023-01-20
    • 2019-08-02
    • 1970-01-01
    • 1970-01-01
    • 2019-07-13
    相关资源
    最近更新 更多