在 Kubernetes 中,如何根据队列的大小进行自动缩放?

Posted

技术标签:

【中文标题】在 Kubernetes 中,如何根据队列的大小进行自动缩放?【英文标题】:In Kubernetes, how do I autoscale based on the size of a queue? 【发布时间】:2016-09-19 12:21:55 【问题描述】:

假设我有一个 RabbitMQ 实例和一组从 RabbitMQ 挑选消息并处理它们的 pod。如何让 Kubernetes 随着队列大小的增加而增加 Pod 的数量?

(我提到的是 RabbitMQ,但这只是一个示例。如果您愿意,请选择您最喜欢的消息队列软件或负载均衡器。)

【问题讨论】:

【参考方案1】:

对此的***解决方案非常简单:

设置一个连接到您的队列的单独容器,并使用 Kubernetes API 来扩展部署。

已经有一些解决方案可以解决这个问题,但它们看起来并没有得到积极维护和生产准备,但可能会有所帮助:

https://github.com/mbogus/kube-amqp-autoscale https://github.com/mbogus/docker-kube-amqp-autoscale https://github.com/onfido/k8s-rabbit-pod-autoscaler

【讨论】:

虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review 感谢您的评论,现已更正! 我有同样的问题,阅读这篇文章,我能够在 AKS 上使用 onfido,效果很好。 (虽然没有开箱即用,但不难调试,RBAC 缺少补丁声明,并且由于某种原因它不喜欢从秘密加载 RMQ 用户名和密码。)【参考方案2】:

您可以使用KEDA。

KEDA 是一个基于 Kubernetes 的事件驱动自动缩放组件。它为在 Kubernetes 中运行的任何容器提供事件驱动规模

它支持开箱即用的 RabbitMQ。您可以关注tutorial,它解释了如何根据 RabbitMQ 队列大小设置简单的自动缩放。

【讨论】:

【参考方案3】:

你可以使用这个工具https://github.com/XciD/k8s-rmq-autoscaler

它将在您的集群上创建一个 pod,该 pod 将监视您的部署并根据其配置进行相应的扩展。

然后你只需要在你的部署中添加一些注释,它就会被自动缩放器监视

kubectl annotate deployment/your-deployment -n namespace \
    k8s-rmq-autoscaler/enable=true \ 
    k8s-rmq-autoscaler/max-workers=20 \ 
    k8s-rmq-autoscaler/min-workers=4 \ 
    k8s-rmq-autoscaler/queue=worker-queue \ 
    k8s-rmq-autoscaler/vhost=vhost

【讨论】:

【参考方案4】:

您可以编写一个非常简单的控制器来监视特定应用程序的队列大小,然后更改复制控制器/副本集/部署所需的副本数。

内置的水平 pod 自动缩放很快就会获得对自定义指标的支持,但在此之前,您自己编写/编写脚本非常简单。

【讨论】:

任何示例、链接或资源都会非常有帮助【参考方案5】:

您可以使用 Worker Pod Autoscaler (WPA):

https://github.com/practo/k8s-worker-pod-autoscaler

RabbitMQ 支持正在等待中。但可以添加。

【讨论】:

以上是关于在 Kubernetes 中,如何根据队列的大小进行自动缩放?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据条件从优先级队列中轮询值

是否有任何工具可以根据 kubernetes 中请求的总 pod 自动扩展 GKE 节点?

我们可以自动和动态地剥离一个 Kubernetes cronjob 吗?我们如何在基于队列或通知的 AWS EKS、Azure AKS 中做到这一点?

Kubernetes 动态作业扩展

Java API 调用将根据队列大小进行合并或在最旧项目插入队列后 4 秒内执行

多线程通信Queue