kubernetes - 当 Pod 通常需要低 CPU 但会定期扩展时,如何使用 K8S HPA 和 autoscaler
问题描述
我正在尝试确定与 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 上找到空间,可能会遇到问题。我的示例是关于一项服务,但在生产部署中还有更多服务。我不想让节点空着提交资源但没有使用。
最好的前进道路是什么?
解决方案
听起来您需要一个将实际 CPU 利用率考虑在内的调度程序。尚不支持此功能。
似乎有关于此功能的工作:KEP - Trimaran: Real Load Aware Scheduling using TargetLoadPackin plugin。另请参阅实际负载平均和可用内存的新调度程序优先级。
同时,如果 CPU 限制为 1 个核心,并且节点在 CPU 利用率高的情况下自动缩放,听起来如果节点远大于 pod 的 CPU 限制,它应该可以工作。例如,尝试使用具有 4 个或更多内核的节点,并且可能对 Pod的CPU 请求稍大一些?
推荐阅读
- python - 如何将带有字符串和 DataFrame 的列表写入 .txt 文件
- paypal - Paypal - CHECKOUT.ORDER.APPROVED 但没有 PAYMENT.CAPTURE.COMPLETED
- android - 使用 Intent 中的值在 ListView 中选择项目
- python - pdf文件中的换行符写入python中的下一行
- git - 从 BitBucket 在 Confluence 中显示 PlantUML
- redis - 我可以在 Redis 中使用同一成员保存多个 GeoEntry 还是有其他选择?
- c - IPC 消息队列
- struct - 为什么我不能使用 C#9 的“with”关键字来创建结构的副本(如使用记录)
- kernel - 在中断处理程序上读取字符导致等待队列永远等待
- amazon-redshift - Redshift: converting timestamp to date in specific time zone