Kubernetes 当POD通常需要较低的CPU,但需要定期扩展时,如何使用K8S HPA和autoscaler

Kubernetes 当POD通常需要较低的CPU,但需要定期扩展时,如何使用K8S HPA和autoscaler,kubernetes,amazon-eks,kubernetes-pod,hpa,Kubernetes,Amazon Eks,Kubernetes Pod,Hpa,我正在尝试确定与K8S一起使用的可靠设置,以使用HPA和autoscaler扩展我的一个部署。我希望尽量减少过度投入的资源量,但允许它根据需要扩大规模 我有一个管理RESTAPI服务的部署。大多数情况下,该服务的使用率非常低(0-5米cpu)。但在一天或一周内,它的使用量会周期性地激增,达到5-10个CPU(5000m-10000m)的数量级 我的初始配置过程是: 部署:1个副本 HPA: 这是在自动缩放器运行的AWS EKS群集上运行的。所有实例都有2个CPU。目标是,随着CPU使用率

我正在尝试确定与K8S一起使用的可靠设置,以使用HPA和autoscaler扩展我的一个部署。我希望尽量减少过度投入的资源量,但允许它根据需要扩大规模

我有一个管理RESTAPI服务的部署。大多数情况下,该服务的使用率非常低(0-5米cpu)。但在一天或一周内,它的使用量会周期性地激增,达到5-10个CPU(5000m-10000m)的数量级

我的初始配置过程是:

  • 部署:1个副本
  • HPA:
这是在自动缩放器运行的AWS EKS群集上运行的。所有实例都有2个CPU。目标是,随着CPU使用率的增加,HPA将分配一个新的pod,该pod是不可调度的,然后autoscaler将分配一个新节点。当我在服务上添加负载时,第一个pod的CPU使用率最高可达90-95%

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

  • 小请求大小
  • 通过使用如此小的请求值(cpu:0.05),即使当前节点处于高负载状态,也可以轻松地在当前节点上调度新请求的POD。因此,autoscaler永远不会找到无法调度且不分配新节点的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利用率的调度程序。这还不受支持

    似乎有人在开发此功能:使用。另见


    同时,如果CPU限制为1个核心,并且节点在高CPU利用率下自动缩放,那么如果节点的CPU限制远远大于POD的CPU限制,则听起来应该可以工作。例如,尝试使用具有4个或更多内核的节点,可能会稍微增大Pod的CPU请求?

    感谢您的快速响应。我很难思考为什么有4个内核会有帮助。今天我将尝试一下,但您能否进一步解释这一部分,以帮助我了解测试时需要的是什么?其想法是,节点自动缩放将在pod自动缩放需要新节点之前的某个时间进行,并希望将其安排到分配较少的节点。这是有意义的。对于您上面的评论,我还找到了对这个自定义调度程序的引用,这可能会有所帮助。我找不到任何文章确切描述如何使用自定义调度器,所以我想我还是会使用标准调度器,看看我能做些什么。您所指的自定义计划程序看起来确实是一个长期解决方案。Pod模板
    schedulerName:
    中有一个字段,用于应使用其他计划程序计划的Pod。我也看到了这一部分,但我没有看到任何文章展示更好的调度器以及如何安装和运行它们。如果这个方法不奏效,我会留意的。
    "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,
       ...
    }