首页 > 解决方案 > 添加新主机时,如何使 pod 均匀分布在节点之间?

问题描述

概述

Kubernetes 调度错误在于“一旦安排好就不会乱动”,这可能导致 CPU、内存和容器计数分布方面的不平衡程度。这也可能意味着有时 Affinity 和 Topology 规则可能不会被强制执行/随着事态的变化:

关于 v1.19(稳定版)中引入的拓扑扩展约束

无法保证在移除 Pod 时仍然满足约束条件。例如,缩小 Deployment 可能会导致 Pod 分布不平衡。

语境

我们目前正在使用pod 拓扑传播约束,它们非常棒,除了它们似乎只在调度期间处理倾斜,而不是执行(与区分Taints 和 Tolerations的能力不同)。

对于Node affinity等功能,我们目前正在等待添加RequiredDuringExecution需求而不是ScheduledDuringExecution需求的能力

问题

我的问题是,在添加新的故障域(拓扑)时,是否有一种本地方法可以让 Kubernetes 重新评估并尝试强制拓扑传播偏斜,而无需编写我自己的调度程序?

还是我需要等待 Kubernetes 推出更多版本?;-)(我希望有人可能对结合亲和力/拓扑约束有一个聪明的答案)

标签: kubernetes

解决方案


经过更多研究,我相当肯定使用像Desceduler这样的外部工具是目前最好的方法。

似乎没有 Taints、Affinity 规则或 Topology 约束的组合可以协同工作以在执行期间实现对拓扑规则的重新评估。

Descheduler 允许您根据用户要求杀死某些工作负载,并让默认kube-scheduler重新调度被杀死的 Pod。它可以使用清单或 Helm 轻松安装并按计划运行。它甚至可以在拓扑发生变化时手动触发,我认为这是我们将实现的以满足我们的需求。

这将是实现我们目标的最佳方式,同时等待RequiredDuringExecution所有功能产品的规则成熟。

鉴于我们的拓扑规则将每个节点标记为一个拓扑区域,我们将采用低节点利用率策略将工作负载分布在新主机上。

apiVersion: "descheduler/v1alpha1"
kind: "DeschedulerPolicy"
strategies:
  "LowNodeUtilization":
    enabled: true
    params:
      nodeResourceUtilizationThresholds:
        thresholds:
          "memory": 20
        targetThresholds:
          "memory": 70

推荐阅读