kubernetes - 添加新主机时,如何使 pod 均匀分布在节点之间?
问题描述
概述
Kubernetes 调度错误在于“一旦安排好就不会乱动”,这可能导致 CPU、内存和容器计数分布方面的不平衡程度。这也可能意味着有时 Affinity 和 Topology 规则可能不会被强制执行/随着事态的变化:
关于 v1.19(稳定版)中引入的拓扑扩展约束
无法保证在移除 Pod 时仍然满足约束条件。例如,缩小 Deployment 可能会导致 Pod 分布不平衡。
语境
我们目前正在使用pod 拓扑传播约束,它们非常棒,除了它们似乎只在调度期间处理倾斜,而不是执行(与区分Taints 和 Tolerations的能力不同)。
对于Node affinity等功能,我们目前正在等待添加RequiredDuringExecution
需求而不是ScheduledDuringExecution
需求的能力
问题
我的问题是,在添加新的故障域(拓扑)时,是否有一种本地方法可以让 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
推荐阅读
- python - 如何以小写形式获取ansible事实
- xml - USPS 国际费率 OriginZip
- javascript - 在什么情况下 Windows 边缘浏览器可以获得文件的完整文件路径?
- python - 如何在循环中打开多个文件,在python中
- ruby - 如何仅从 Ruby 中的 CSV 文件打印行中的第一个值?
- sql - 需要通过 SQL 将管道分隔字段与 Presto 中的字符串进行比较
- java - 我想在静态值为 0 或其他时更改活动
- database - 查询需要很长时间 neo4j 才能合并关系
- asp.net - Blazor - Web 组件 - WebAssembly - 微前端
- amazon-web-services - 找出与 TypeORM 一起使用的本地端口