Kubernetes-based Event Driven Autoscaling (KEDA) bir kubernetes operatörü olarak çalışır ve event-driven scaling – olay odaklı autoscaling işlemleri yapar.
Uygulamalarımızın üzerindeki yüklere göre, bizim belirlediğimiz(dinamik) kriterlere uygun (olay odaklı) auto-scale edilebilmesini sağlar.

Kubernetes HPA da genellikle kaynak kullanımına dayandırılmış bir auto scaling kullanmaktayız. KEDA’ da ise kaynak kullanımı, özel metrikler(prometheus vs) ve olay tabanlı (örneğin http req, rabbitmq kuyrukta bekleyen sayı, mysql sorguları ve ihtiyaçlarınız doğrultusunda buna benzer) bir auto-scaling çözümü olarak karşımıza çıkar.
KEDA kullanırken ScaledObject’ ler tanımlarız, Bu ScaledObject’ ler uygulamamızın nasıl ölçeklendirileceğini belirtir.
KEDA github reposu;
KEDA resmi web sayfasına buraya tıklayarak ulaşıp, olay odaklarını da ayrıca inceleyebilirsiniz.
Şimdi KEDA’ yı Kubernetes Cluster’ ımıza kuralım ve mysql için bir scaledobject tanımlayalım. Olay tabanlı bir obje olsun ve testlerimizi yapalım.
Test’ imizi keda namespace’ i oluşturup ilgili namespace’ de tanımlıyorum.
kubectl create ns keda
helm repo add bitnami https://charts.bitnami.com/bitnami
helm install my-keda kedacore/keda --version 2.15.1
Pod’ larımız running state’ e geçiyor ve Keda kurulumumuz tamamlanıyor.
kubectl get po -n keda
NAME READY STATUS RESTARTS AGE
keda-admission-webhooks-75b4797d44-4hh9h 1/1 Running 0 75m
keda-operator-5bc55746dc-lqzsk 1/1 Running 0 45m
keda-operator-metrics-apiserver-847fc48fd4-k788r 1/1 Running 0 75m
Test için birtane de mysql kuralım helm ile hızlıca;
helm install my-mysql bitnami/mysql --version 11.1.15
my-mysql-0 1/1 Running 0 30m
Şimdi KEDA’ mız hazır, Mysql’ imiz de hazır;
Mysql’ imiz için bir adet ScaledObject tanımlayıp, olaya göre bir auto-scaling işlemi gerçekleştireceğiz,
Paylaştığım örnekte; bir StatefulSet’ in auto-scaling i MySQL veritabanındaki sorgu sonuçlarına göre yapılandırılmıştır.
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: mysql-scaledobject
namespace: keda
labels:
deploymentName: my-mysql
spec:
minReplicaCount: 1
maxReplicaCount: 4
pollingInterval: 3
cooldownPeriod: 5
scaleTargetRef:
name: my-mysql
kind: StatefulSet
triggers:
- type: mysql
metadata:
username: "root"
passwordFromEnv: MYSQL_ROOT_PASSWORD
host: "my-mysql.keda.svc.cluster.local"
dbName: "mysql"
port: "3306"
queryValue: "5"
query: "SELECT COUNT(*) FROM test WHERE state=QUEUED"
Not: minreplicacount’ u 1 olarak belirtmezsek, pod’ umuzu 0′ a da çekebilir.
Şimdi dosyamızı mysql-keda.yaml olarak kaydedip çalıştırıp, objemizi oluşturuyoruz. Oluşturduktan sonra objemizin mysql’ e erişimini aşağıdaki gibi kontrol edebiliriz.
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal KEDAScalersStarted 4s keda-operator Scaler mysql is built.
Normal KEDAScalersStarted 3s keda-operator Started scalers watch
Normal ScaledObjectReady 3s (x2 over 3s) keda-operator ScaledObject is ready for scaling
Testlerinizi yapmadan önce mysql database’ i üzerinde test tablosunu oluşturup state column’ u oluşturmanız gerekmektedir.
pollingInterval: KEDA’ nın verileri kontrol etme sıklığı,
cooldownPeriod: KEDA’ nın 1. auto scaling yaptıktan sonra 2.auto-scaling’ i yapmadan önceki bekleme süresi.
Şimdi database’ e bağlanıp kontrol ettiği olayı ‘QUEUED’ i instert edelim 6 tane 🙂
INSERT INTO test (state) VALUES ('QUEUED');
Şimdi podlarımızı kontrol edelim.

Şimdi kayıt eklemeye devam edelim belirli aralıklarla ve bu durumda belirlediğimiz koşullarda maxReplicaCount’ a ulaşıp 4 adet pod oluşturmasını bekleyeceğiz.

Şimdi de, ilgili QUEQUED state sayısını tekrar 5 olacak şekilde kayıtları temizliyorum,

Böylece olay bazlı auto-scale işlemlerini, KEDA kullanarak tamamlamış olduk.
Yine CPU, memory gibi HPA da kullandığımız metrikleri de KEDA ile yönetebilmekteyiz.
Faydalı Olması Dileklerimle