我正在尝试确定一个可靠的设置,以便与K8S一起使用HPA和自动缩放器来扩展我的一个部署。我想尽量减少过度投入的资源,但允许它根据需要扩大规模。
我有一个正在管理REST API服务的部署。大多数时候,该服务的使用率非常低(0-5m cpu(。但在一天或一周中,它的使用量会周期性地激增,达到5-10个CPU(5000米至10000米(的数量级。
我配置这个的第一步是:
- 部署: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,然后自动缩放器将分配新节点。当我增加服务负载时,第一个吊舱的CPU使用率最高可达90-95%
我遇到了两个相关的问题:
- 请求大小较小
通过使用如此小的请求值(cpu:0.05(,即使在当前节点处于高负载下,也可以轻松地在当前节点上调度新请求的pod。因此,自动缩放器永远不会找到一个不能调度并且不分配新节点的pod。我可以增加较小的请求大小并过度投入,但这意味着在绝大多数情况下,当没有负载时,我将浪费我不需要的资源。
- 随着分配更多pod,平均CPU减少
因为pod都分配在同一个节点上,所以一旦分配了新的pod,它就开始共享节点的可用2个CPU。这反过来又减少了吊舱使用的CPU数量,从而将平均值保持在75%的目标以下。
(例如:3个吊舱,2个CPU==>每个吊舱的平均CPU使用率最高为66%(
我在这里寻求关于我应该如何思考这个问题的指导。我想我错过了一些简单的东西。
我目前的想法是,我正在寻找一种方法,让Pod资源请求值在更重的负载下增加,然后在系统不需要时减少。这会让我倾向于使用类似VPA的东西,但我读到的所有内容都表明,同时使用HPA和VPA会导致非常糟糕的事情。
我认为将请求从0.05增加到0.20可能会让我处理放大的情况。但这反过来会浪费大量资源,如果调度器在现有吊舱上找到空间,可能会出现问题。我的示例是关于一个服务,但是在生产部署中还有更多的服务。我不想让节点空着,有提交的资源,但没有使用。
这里最好的前进道路是什么?
听起来您需要一个考虑实际CPU利用率的调度器。这还不受支持。
似乎有关于这个功能的工作:KEP-Trimaran:使用TargetLoadPackin插件的实时负载感知调度。另请参阅实际负载平均值和可用内存的新调度程序优先级。
与此同时,如果CPU限制为1核心,并且节点在高CPU利用率下自动缩放,那么如果节点大大大于pod的CPU限制,听起来应该可以工作。例如,尝试使用具有4个或更多核心的节点,并且可能稍大Pod的CPU请求?