水平 pod 自动缩放器在 GKE 上过于激进地扩展自定义指标

Ere*_*ush 6 rabbitmq kubernetes google-kubernetes-engine kubernetes-hpa

我有以下的谷歌Kubernetes发动机水平波德Autoscaller配置比例由度量的自定义部署-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
Run Code Online (Sandbox Code Playgroud)

sup*_*654 5

我认为您很好地解释targetValue了Horizo​​ntalPodAutoscalers 的工作原理。但是,根据您的问题,我认为您正在寻找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
Run Code Online (Sandbox Code Playgroud)

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

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