水平吊舱自动缩放器在GKE上过于主动地缩放自定义指标

时间:2019-09-10 11:32:56

标签: kubernetes rabbitmq google-kubernetes-engine kubernetes-hpa

我在Google Kubernets Engine上具有以下“水平Pod自动缩放器”配置,以通过自定义指标-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 个答案:

答案 0 :(得分:2)

根据https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/

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

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

从上面的内容我了解到,只要队列中有消息,由于currentReplicasdesiredReplicas计算的一部分,因此k8 HPA将继续扩大。

例如,如果:

currentReplicas = 1

currentMetricValue / desiredMetricValue = 2/1

然后:

desiredReplicas = 2

如果指标在下一个hpa周期保持不变,则currentReplicas将变为2,而desiredReplicas将升高至4

答案 1 :(得分:1)

我认为explaining how targetValue works在Horizo​​ntalPodAutoscalers方面做得很好。但是,根据您的问题,我认为您正在寻找的是targetAverageValue而不是targetValue

the Kubernetes docs on HPAs中,它提到使用targetAverageValue指示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具有较低的平均消息延迟。理想情况下,在通信量恒定的情况下,您应该努力使Pods处理消息的数量恒定(这要求您以与入队相同的速率处理消息)。

答案 2 :(得分:0)

尝试遵循此说明,该说明描述import os import sys def getTechWork( techName ): print("Finding technicians") def main(): print("Main Function") getTechWork("Adams, Keith") if __name__== "__main__": main() RabbitMQ的水平自动缩放设置

Kubernetes Workers Autoscaling based on RabbitMQ queue size

尤其建议使用指标k8s targetValue: 20 代替rabbitmq_queue_messages_ready

targetValue: 1
  

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

答案 3 :(得分:0)

我使用的是与RabbitMQ相同的Prometheus指标(我使用的是Celery,RabbitMQ作为代理)。

这里是否有人考虑使用rabbitmq_queue_messages_unacked指标而不是rabbitmq_queue_messages_ready

问题是,rabbitmq_queue_messages_ready会随着工作人员拉出的消息而减少,我担心长时间运行的任务可能会被HPA杀死,而rabbitmq_queue_messages_unacked会一直保留直到任务完成

例如,我收到一条消息,该消息将触发一个新的pod(芹菜工人)运行需要30分钟的任务。 rabbitmq_queue_messages_ready会随着Pod的运行而减少,HPA的冷却/延迟将终止Pod。