我在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
答案 0 :(得分:2)
根据https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/
从最基本的角度来看,Horizontal Pod Autoscaler控制器将根据所需度量值与当前度量值之间的比率进行操作:
desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )]
从上面的内容我了解到,只要队列中有消息,由于currentReplicas
是desiredReplicas
计算的一部分,因此k8 HPA将继续扩大。
例如,如果:
currentReplicas
= 1
currentMetricValue
/ desiredMetricValue
= 2/1
然后:
desiredReplicas
= 2
如果指标在下一个hpa周期保持不变,则currentReplicas
将变为2,而desiredReplicas
将升高至4
答案 1 :(得分:1)
我认为explaining how targetValue
works在HorizontalPodAutoscalers方面做得很好。但是,根据您的问题,我认为您正在寻找的是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。