Suppose I have a RabbitMQ instance and a set of pods that pick messages from RabbitMQ and process them. How do I make Kubernetes increase the number of pods as the queue size increases?
(I'm mentioning RabbitMQ, but that's just an example. Pick your favorite message queue software or load balancer if you wish.)
You can write a very simple controller that watches the queue size for your specific application and then changes the number of desired replicas of your replication controller / replica set / deployment.
The built-in horizontal pod autoscaling is soon gaining support for custom metrics, but until then this is pretty simple to program/script yourself.
The top-level solution to this is quite straightforward:
Set up a separate container that is connected to your queue, and uses the Kubernetes API to scale the deployments.
There exist some solutions to this problem already, but they do however not look like they are actively maintained and production ready, but might help:
You could use this tool https://github.com/XciD/k8s-rmq-autoscaler
It will create a pod on your cluster that will watch your deployments and scale it accordingly to their configuration.
You then just need to add some annotation into your deployments and it will be watched by the autoscaler
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