在 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 中做到这一点?