kubernetes - 当 Pod 通常需要低 CPU 但定期扩展时,如何使用 K8S HPA 和自动缩放器

标签 kubernetes amazon-eks kubernetes-pod hpa

我正在尝试确定一种与 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%。

我遇到了两个相关的问题:

  1. 请求大小较小

通过使用如此小的请求值(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/

    相关文章:

    node.js - 如何将来自容器的所有流量路由到同一个 Kubernetes pod 中的另一个容器?

    amazon-web-services - Kubernetes:无法从 EKS pod 访问 RDS Postgres

    docker - 在运行时在Pod中创建其他容器的正确方法是什么?

    kubernetes - Kubernetes configmaps 中的自动子目录?

    docker - Kubernetes Pods 与内部/外部 IP 地址互通

    使用证书加密的 Kubernetes secret ?

    amazon-web-services - Kubernetes pod 卡在待处理状态且没有事件

    amazon-web-services - AWS EKS - 创建负载均衡器 Controller 失败

    amazon-web-services - 在 aws kops 集群中部署 pod

    kubernetes - dnsConfig 在 GKE 中被跳过