首页 > 解决方案 > 当 Pod 通常需要低 CPU 但会定期扩展时,如何使用 K8S HPA 和 autoscaler

问题描述

我正在尝试确定与 K8S 一起使用的可靠设置,以使用 HPA 和自动缩放器扩展我的一个部署。我想尽量减少过度使用的资源量,但允许它根据需要扩展。

我有一个管理 REST API 服务的部署。大多数情况下,该服务的使用率非常低(0m-5m cpu)。但在一天或一周内,它会周期性地飙升至 5-10 个 CPU (5000m-10000m) 的更高使用率。

我最初的配置是:

"resources": {
   "requests": {
     "cpu": 0.05
   },
   "limits": {
      "cpu": 1.0
   }
}
"spec": {
   "maxReplicas": 25,
   "metrics": [
      {
         "resource": {
         "name": "cpu",
         "target": {
            "averageValue": 0.75,
            "type": "AverageValue"
         }
         },
         "type": "Resource"
      }
   ],
   "minReplicas": 1,
   ...
}

这是在运行自动扩缩器的 AWS EKS 集群上运行的。所有实例都有 2 个 CPU。目标是随着 CPU 使用率的上升,HPA 将分配一个不可调度的新 pod,然后自动缩放器将分配一个新节点。当我在服务上增加负载时,第一个 pod 的 CPU 使用率最高会飙升至大约 90-95%。

我遇到了两个相关的问题:

  1. 小请求大小

通过使用这么小的请求值(cpu:0.05),即使在高负载下,新请求的 Pod 也可以轻松地调度到当前节点上。因此,自动缩放器永远不会找到无法调度且不会分配新节点的 pod。我可以增加较小的请求大小并过度使用,但这意味着在绝大多数没有负载的情况下,我将浪费我不需要的资源。

  1. 随着分配更多 pod,平均 CPU 减少

因为 pod 都被分配在同一个节点上,所以一旦分配了一个新的 pod,它就会开始共享该节点的 2 个可用 CPU。这反过来又减少了 pod 使用的 CPU 量,从而使平均值保持在 75% 的目标以下。

(例如:3 个 pod,2 个 CPU ==> 最大 66% 每个 pod 的平均 CPU 使用率)

我在这里寻找关于我应该如何考虑这个问题的指导。我想我错过了一些简单的东西。

我目前的想法是,我正在寻找一种方法,让 Pod 资源请求值在较重的负载下增加,然后在系统不需要时减少。这将使我倾向于使用 VPA 之类的东西,但我读过的所有内容都表明同时使用 HPA 和 VPA 会导致非常糟糕的事情

我认为将请求从 0.05 增加到 0.20 可能会让我处理扩大规模的情况。但这反过来会浪费大量资源,如果调度程序在现有 pod 上找到空间,可能会遇到问题。我的示例是关于一项服务,但在生产部署中还有更多服务。我不想让节点空着提交资源但没有使用。

最好的前进道路是什么?

标签: kubernetesamazon-ekskubernetes-podhpa

解决方案


听起来您需要一个将实际 CPU 利用率考虑在内的调度程序。尚不支持此功能。

似乎有关于此功能的工作:KEP - Trimaran: Real Load Aware Scheduling using TargetLoadPackin plugin。另请参阅实际负载平均和可用内存的新调度程序优先级

同时,如果 CPU 限制为 1 个核心,并且节点在 CPU 利用率高的情况下自动缩放,听起来如果节点远大于 pod 的 CPU 限制,它应该可以工作。例如,尝试使用具有 4 个或更多内核的节点,并且可能对 Pod的CPU 请求稍大一些?


推荐阅读