6

我在 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
4

4 回答 4

2

我认为您在解释 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 处理消息的数量恒定(这要求您以与它们排队的速度大致相同的速度处理消息)。

于 2019-09-15T18:32:35.167 回答
2

根据https://kubernetes.io/docs/tasks/run-application/horizo​​ntal -pod-autoscale/

从最基本的角度来看,Horizo​​ntal Pod Autoscaler 控制器根据所需度量值与当前度量值之间的比率进行操作:

desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )]

从上面我了解到,只要队列有消息,k8 HPA 就会继续扩大,因为currentReplicas这是desiredReplicas计算的一部分。

例如,如果:

currentReplicas= 1

currentMetricValue/ desiredMetricValue= 2/1

然后:

desiredReplicas= 2

如果指标在下一个 hpa 周期中保持不变,currentReplicas将变为 2 并将desiredReplicas提高到 4

于 2019-09-11T12:54:52.933 回答
1

尝试按照描述 in 的水平自动缩放设置的说明RabbitMQ进行操作k8s

基于 RabbitMQ 队列大小的 Kubernetes Workers 自动缩放

特别是,推荐使用targetValue: 20of metricrabbitmq_queue_messages_ready而不是targetValue: 1

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: workers-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1beta1
    kind: Deployment
    name: my-workers
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: External
    external:
      metricName: "custom.googleapis.com|rabbitmq_queue_messages_ready"
      metricSelector:
        matchLabels:
          metric.labels.queue: myqueue
      **targetValue: 20

现在如果 RabbitMQ 队列 myqueue 总共有超过 20 个未处理的作业,我们的部署 my-workers 将会增长

于 2019-09-10T16:08:38.110 回答
0

我正在使用来自 RabbitMQ 的相同 Prometheus 指标(我使用 Celery 和 RabbitMQ 作为代理)。

这里有人考虑过使用rabbitmq_queue_messages_unackedmetric 而不是 metricrabbitmq_queue_messages_ready吗?

问题是,rabbitmq_queue_messages_ready一旦工人拉出消息,它就会减少,我担心长时间运行的任务可能会被 HPA 杀死,而rabbitmq_queue_messages_unacked一直持续到任务完成。

例如,我有一条消息会触发一个新的 pod (celery-worker) 来运行一个需要 30 分钟的任务。将rabbitmq_queue_messages_ready随着 pod 运行而减少,HPA 冷却/延迟将终止 pod。

编辑:似乎第三个rabbitmq_queue_messages是正确的 - 这是未确认和准备好的总和:

就绪和未确认消息的总和 - 总队列深度

文件

于 2020-12-08T16:33:24.937 回答