首页 > 解决方案 > 在 K8s 中为波动负载设置 cpu 请求

问题描述

我在 Kubernetes 中部署了一项服务,我正在尝试优化请求的 cpu 资源

目前,我已经部署了 10 个实例,并根据“平均”使用情况设置spec.containers[].resources.limits.cpu为。0.1然而,很明显,这个平均值在实践中相当无用,因为在恒定负载下,负载显着增加(据我所知,增加到 0.3-0.4)。

因此,当多个实例部署在同一个节点上时,会发生该节点严重过载的情况;pod 不再响应,被杀死并重新启动等。

找到良好价值的最佳做法是什么?我目前最好的猜测是将请求的 cpu 增加到 0.3 或 0.4;我正在查看 Grafana 可视化,并看到负载重的节点上的 pod 在持续负载下会聚在那里。但是,我怎么知道他们是否会在由于节点过载而变得无响应之前使用更多负载?

我实际上是在试图了解如何解决这个问题。我希望“理想”服务(假设它以 CPU 为中心)在0.0没有负载时使用接近,当请求不断进入时接近 1.0。有了这个假设,我应该cpu.requests1.0假设实际恒定使用情况?

我已经阅读了一些Kubernetes 最佳实践指南,但它们似乎都没有比“找到平均值”更深入地解决如何在实践中为 cpu 请求设置实际值。

标签: kubernetesloadcpu-usage

解决方案


简而言之:主要目标是了解 Pod 可以处理多少流量以及为此消耗多少资源。

CPU 限制很难理解并且可能是有害的,您可能想要避免它们,请参阅静态策略文档相关的 github 问题

要确定 CPU 请求的大小,您首先需要了解 pod 在高负载期间可以消耗多少。为此,您可以:

  • 禁用所有类型的自动缩放(HPA、垂直 pod 自动缩放器,...)
  • 将副本数设置为 1
  • 解除 CPU 限制
  • 在一个节点上请求尽可能多的 CPU(通常在 4cpu 节点上为 3.2)
  • 在应用程序上发送尽可能多的流量(例如,您可以使用locust实现简单的负载测试场景)

你最终会得到一个 ratio clients-or-requests-per-sec/cpu-consumed。您可以假设该关系是线性的(如果您的工作负载复杂度为 O(n^2) 且连接的客户端数量为 n,则这可能不是真的,但这不是名义上的情况)

然后你可以选择一个关于这个数字的请求,例如,如果你每秒消耗 1.2 个 cpu 来处理 1000 个请求,你知道你可以给每个 pod 1 个 cpu,它每秒最多可以处理 800 个请求。

既然您知道 pod 在其最大负载下可以消耗多少,您可以开始设置基于 cpu 的自动缩放,如果遇到延迟或自动缩放不够快等问题,70% 是一个很好的第一个目标。如果负载增加,这将避免您的节点耗尽 cpu。

有一些陷阱,例如单线程应用程序不能消耗超过一个 cpu。因此,如果您给它 1.5 cpu,它将用完 cpu,但您将无法从指标中对其进行可视化,因为您会相信它仍然可以消耗 0.5 cpu。


推荐阅读