首页 > 解决方案 > 水平 pod Autoscaler 在 GKE 上过于激进地扩展自定义指标

问题描述

我在 Google Kubernetes Engine 上有以下 Horizo​​ntal Pod Autoscaler 配置,可以通过自定义指标扩展部署 -RabbitMQ messages ready count针对特定队列:foo-queue.

它正确地获取度量值。

插入 2 条消息时,它会将部署扩展到最多 10 个副本。我希望它可以扩展到 2 个副本,因为 targetValue 是 1 并且有 2 条消息准备好了。

为什么它会如此积极地扩展?

HPA 配置:

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: foo-hpa
  namespace: development
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: foo
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: External
    external:
      metricName: "custom.googleapis.com|rabbitmq_queue_messages_ready"
      metricSelector:
        matchLabels:
          metric.labels.queue: foo-queue
      targetValue: 1

标签: kubernetesrabbitmqgoogle-kubernetes-enginekubernetes-hpa

解决方案


我认为您在解释 Horizo​​ntalPodAutoscaler的targetValue工作原理方面做得很好。但是,根据您的问题,我认为您正在寻找targetAverageValue而不是targetValue.

关于 HPA 的 Kubernetes 文档中,它提到 usingtargetAverageValue指示 Kubernetes 根据自动缩放器下所有 Pod 公开的平均指标来缩放 Pod。虽然文档没有明确说明,但外部指标(如消息队列中等待的作业数量)计为单个数据点。通过使用 缩放外部指标targetAverageValue,您可以创建一个自动缩放器来缩放 Pod 的数量以匹配 Pod 与作业的比率。

回到你的例子:

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: foo-hpa
  namespace: development
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: foo
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: External
    external:
      metricName: "custom.googleapis.com|rabbitmq_queue_messages_ready"
      metricSelector:
        matchLabels:
          metric.labels.queue: foo-queue
      # Aim for one Pod per message in the queue
      targetAverageValue: 1

将导致 HPA 尝试为队列中的每条消息保留一个 Pod(最多 10 个 Pod)。

顺便说一句,每条消息定位一个 Pod 可能会导致您不断地启动和停止 Pod。如果您最终启动了大量 Pod 并处理队列中的所有消息,Kubernetes 会将您的 Pod 缩减为 1。根据启动 Pod 所需的时间以及处理您的消息所需的时间,您可能通过指定更高的targetAverageValue. 理想情况下,给定恒定的流量,您的目标应该是让 Pod 处理消息的数量恒定(这要求您以与它们排队的速度大致相同的速度处理消息)。


推荐阅读