我正在尝试确定与 K8S 一起使用的可靠设置,以使用 HPA 和自动缩放器扩展我的一个部署。我想尽量减少过度使用的资源量,但允许它根据需要扩展。
我有一个管理 REST API 服务的部署。大多数情况下,该服务的使用率非常低(0m-5m cpu)。但在一天或一周内,它会周期性地飙升至 5-10 个 CPU (5000m-10000m) 的更高使用率。
我最初的配置是:
- 部署:1 个副本
"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%。
我遇到了两个相关的问题:
- 小请求大小
通过使用这么小的请求值(cpu:0.05),即使在高负载下,新请求的 Pod 也可以轻松地调度到当前节点上。因此,自动缩放器永远不会找到无法调度且不会分配新节点的 pod。我可以增加较小的请求大小并过度使用,但这意味着在绝大多数没有负载的情况下,我将浪费我不需要的资源。
- 随着分配更多 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 上找到空间,可能会遇到问题。我的示例是关于一项服务,但在生产部署中还有更多服务。我不想让节点空着提交资源但没有使用。
最好的前进道路是什么?