我正在尝试确定一种与 K8S 一起使用的可靠设置,以使用 HPA 和自动缩放器来扩展我的一个部署。我希望最大限度地减少过度使用的资源量,但允许其根据需要进行扩展。
我有一个正在管理 REST API 服务的部署。大多数时候,服务的使用率非常低(0m-5m cpu)。但每天或每周,它的使用率会定期飙升至 5-10 个 CPU (5000m-10000m) 左右。
我的初始配置是:
- 部署:1 个副本
"resources": {
"requests": {
"cpu": 0.05
},
"limits": {
"cpu": 1.0
}
}
- HPA:
"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 ==> 每个 Pod 的平均 CPU 使用率最大为 66%)
我在这里寻求关于我应该如何思考这个问题的指导。我想我错过了一些简单的东西。
我目前的想法是,我正在寻找一种方法,让 Pod 资源请求值在较重的负载下增加,然后在系统不需要时减少。这会让我倾向于使用 VPA 之类的东西,但我读过的所有内容都表明,同时使用 HPA 和 VPA 会导致非常糟糕的事情。
我认为将请求从 0.05 增加到 0.20 之类的值可能会让我处理扩大规模的情况。但这反过来会浪费大量资源,并且如果调度程序在现有 pod 上找到空间,则可能会遇到问题。我的示例涉及一项服务,但生产部署中还有更多服务。我不希望节点处于空状态且已提交资源但没有使用。
这里最好的前进道路是什么?
最佳答案
听起来您需要一个考虑实际 CPU 利用率的调度程序。尚不支持此功能。
似乎有关于此功能的工作: KEP - Trimaran: Real Load Aware Scheduling 使用 TargetLoadPackin plugin 。另请参阅New scheduler priority for real load average and free memory .
同时,如果 CPU 限制为 1 个核心,并且节点在高 CPU 利用率下自动缩放,那么如果节点远大于 Pod 的 CPU 限制,听起来应该可以工作 。例如。尝试使用具有 4 个或更多核心的节点,并且 Pod 的 CPU 请求可能稍大一些?
关于kubernetes - 当 Pod 通常需要低 CPU 但定期扩展时,如何使用 K8S HPA 和自动缩放器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66879191/