kubernetes event-driven pods autoscaling with keda and rabbitmq

0
799

hi sobat sekolahlinux, in this article i will tell you about how to implement kubernetes event-driven pods autoscaling with keda and rabbitmq,

RABBITMQ

I assume you already have and run rabbitmq with detail below

rabbitmq_host: 192.168.99.150
rabbitmq_user: admin
rabbitmq_pass: qwerty12345
rabbitmq_queue_name: sekolahlinux

you can generate queue with python script, but you must install pika library first

python3 -m pip install pika --upgrade

and you can use script python send.py below for send or produce message to queue name sekolahlinux

#!/usr/bin/env python
import pika
import sys

parameters = pika.URLParameters('amqp://admin:qwerty12345@192.168.99.150:5672/')
connection = pika.BlockingConnection(parameters)
channel = connection.channel()

channel.queue_declare(queue='sekolahlinux', durable=True)

message = ' '.join(sys.argv[1:]) or "Hello World!"
channel.basic_publish(
    exchange='',
    routing_key='sekolahlinux',
    body=message,
    properties=pika.BasicProperties(
        delivery_mode=pika.spec.PERSISTENT_DELIVERY_MODE
    ))
print(" [x] Sent %r" % message)
connection.close()

after you create send.py you can run with command below, if you run command below once, you can create 1 queue length, and if you run again you have 2 queue length in sekolahlinux queue, repeat for create more queue length for triger hpa base on queue length with keda

python3 send.py test1
python3 send.py test2
python3 send.py test3
python3 send.py test4
python3 send.py test5
python3 send.py test6 ...

after you run send.py you will create queue name sekolahlinux with queue length 6 like image below

KEDA

for setup keda you can use helm, for detail you can visit link below

after you deploy keda on you k8s cluster, now create manifest deployment.yaml like below

apiVersion: apps/v1
kind: Deployment
metadata:
  name: php-apache
spec:
  selector:
    matchLabels:
      run: php-apache
  template:
    metadata:
      labels:
        run: php-apache
    spec:
      containers:
      - name: php-apache
        image: k8s.gcr.io/hpa-example
        ports:
        - containerPort: 80
        resources:
          limits:
            cpu: 500m
          requests:
            cpu: 200m

and before you create manifest keda.yaml you must encode your rabbitmq url connection with base64 like below

echo -n "amqp://user:user@192.168.99.150:5672/"|base64

after you run command above you will get result like below

YW1xcDovL3VzZXI6dXNlckAxOTIuMTY4Ljk5LjE1MDo1NjcyLw==

now you can create manifest keda.yaml like below, and use result from encode base64 above

apiVersion: v1
kind: Secret
metadata:
  name: keda-rabbitmq-secret
data:
  host: YW1xcDovL3VzZXI6dXNlckAxOTIuMTY4Ljk5LjE1MDo1NjcyLw==
---
apiVersion: keda.sh/v1alpha1
kind: TriggerAuthentication
metadata:
  name: keda-trigger-auth-rabbitmq-conn
  namespace: default
spec:
  secretTargetRef:
    - parameter: host
      name: keda-rabbitmq-secret
      key: host
---
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: rabbitmq-scaledobject
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: php-apache
  minReplicaCount: 1
  maxReplicaCount: 4    
  triggers:
  - type: rabbitmq
    metadata:
      protocol: amqp
      queueName: sekolahlinux
      mode: QueueLength
      value: "4"
    authenticationRef:
      name: keda-trigger-auth-rabbitmq-conn

 

now we can apply the manifest with command below

kubectl apply -f deployment.yaml
kubectl apply -f keda.yaml

if you want simulate the pods autoscaler you can run send.py 4x or more for triger pods autoscale

reference: