Pods 通常需要低 CPU 但定期缩放时如何使用 K8S HPA 和自动缩放器
How to use K8S HPA and autoscaler when Pods normally need low CPU but periodically scale
我正在尝试确定与 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 CPUs。目标是随着 CPU 使用量的增加,HPA 将分配一个不可调度的新 pod,然后自动缩放器将分配一个新节点。当我在服务上添加负载时,第一个 pod 的 CPU 使用率在最大值时飙升至大约 90-95%。
我 运行 陷入两个相关的问题:
- 小请求大小
通过使用这么小的请求值(cpu: 0.05),新请求的pods即使在高负载的情况下也可以轻松调度到当前节点上。因此,自动缩放器永远不会找到无法调度且不会分配新节点的 pod。我可以增加小请求的大小并过度使用,但这意味着在绝大多数没有负载的情况下,我将浪费我不需要的资源。
- 随着更多 pods 的分配,平均 CPU 减少
因为 pods 全部分配在同一个节点上,一旦分配了新的 pod,它就会开始共享节点的可用 2 CPUs。这反过来又减少了 pod 使用的 CPU 数量,从而使平均值保持在 75% 目标以下。
(例如:3 pods、2 CPUs ==> 最大 66% 平均每个 pod CPU 使用率)
我正在这里寻找关于我应该如何思考这个问题的指导。我想我错过了一些简单的东西。
我目前的想法是,我正在寻找一种方法,让 Pod 资源请求值在较重的负载下增加,然后在系统不需要时减少。这会让我倾向于使用像 VPA 这样的东西,但我读过的所有内容都说同时使用 HPA 和 VPA 会导致非常糟糕的事情。
我认为将请求从 0.05 增加到 0.20 可能会让我处理扩展的情况。但这反过来会浪费大量资源,并且如果调度程序在现有 pod 上找到 space 可能会遇到问题。我的示例是关于一项服务,但在生产部署中还有更多服务。我不希望节点空着,但没有使用已提交的资源。
这里最好的前进道路是什么?
听起来您需要一个将实际 CPU 利用率考虑在内的调度程序。尚不支持。
似乎有关于此功能的工作:KEP - Trimaran: Real Load Aware Scheduling using TargetLoadPackin plugin. Also see New scheduler priority for real load average and free memory。
与此同时,如果 CPU 限制为 1 个核心,并且节点在高 CPU 利用率下自动缩放,听起来它应该工作 如果节点很大大于 pods 的 CPU 限制。例如。尝试使用具有 4 个或更多核心且可能稍大的节点 CPU 为 Pod 请求?
我正在尝试确定与 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 CPUs。目标是随着 CPU 使用量的增加,HPA 将分配一个不可调度的新 pod,然后自动缩放器将分配一个新节点。当我在服务上添加负载时,第一个 pod 的 CPU 使用率在最大值时飙升至大约 90-95%。
我 运行 陷入两个相关的问题:
- 小请求大小
通过使用这么小的请求值(cpu: 0.05),新请求的pods即使在高负载的情况下也可以轻松调度到当前节点上。因此,自动缩放器永远不会找到无法调度且不会分配新节点的 pod。我可以增加小请求的大小并过度使用,但这意味着在绝大多数没有负载的情况下,我将浪费我不需要的资源。
- 随着更多 pods 的分配,平均 CPU 减少
因为 pods 全部分配在同一个节点上,一旦分配了新的 pod,它就会开始共享节点的可用 2 CPUs。这反过来又减少了 pod 使用的 CPU 数量,从而使平均值保持在 75% 目标以下。
(例如:3 pods、2 CPUs ==> 最大 66% 平均每个 pod CPU 使用率)
我正在这里寻找关于我应该如何思考这个问题的指导。我想我错过了一些简单的东西。
我目前的想法是,我正在寻找一种方法,让 Pod 资源请求值在较重的负载下增加,然后在系统不需要时减少。这会让我倾向于使用像 VPA 这样的东西,但我读过的所有内容都说同时使用 HPA 和 VPA 会导致非常糟糕的事情。
我认为将请求从 0.05 增加到 0.20 可能会让我处理扩展的情况。但这反过来会浪费大量资源,并且如果调度程序在现有 pod 上找到 space 可能会遇到问题。我的示例是关于一项服务,但在生产部署中还有更多服务。我不希望节点空着,但没有使用已提交的资源。
这里最好的前进道路是什么?
听起来您需要一个将实际 CPU 利用率考虑在内的调度程序。尚不支持。
似乎有关于此功能的工作:KEP - Trimaran: Real Load Aware Scheduling using TargetLoadPackin plugin. Also see New scheduler priority for real load average and free memory。
与此同时,如果 CPU 限制为 1 个核心,并且节点在高 CPU 利用率下自动缩放,听起来它应该工作 如果节点很大大于 pods 的 CPU 限制。例如。尝试使用具有 4 个或更多核心且可能稍大的节点 CPU 为 Pod 请求?