KEDA: Kubernetes Event-Driven Autoscaling

Ali Altoğ
ÇSTech
Published in
3 min readDec 26, 2022

Kubernetes ortamında konu scaling olduğuda karşımıza iki seçenek çıkıyor. Bunlardan birincisi HPA (Horizontal Pod Autoscaler) ikincisi ise VPA (Vertical Pod Autoscaler)’dir. HPA verilen metrik değerlerine göre mevcut durumda bulunan k8s workload bileşenlerinin (Örn. Deployment) pod sayılarını arttırarak belirlenen metrik için sınır değerin altına düşene kadar işlemi devam ettirir.

kubernetes.io

Kubernetes üzerinde koşan bir servisimizi HPA kullanarak ortalama CPU kullanımına göre scale up ve scale down yapabiliyoruz. HPA default olarak metrik değerlerini her 15 saniyede kontrol eder. HPA için k8s içerisinde çalışan algoritma aşağıdaki gibidir.

desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )]

Buradaki değerlerin anlamları ;

desiredReplicas: Hesaplamadan sonra ortaya çıkan ve olması gerek pod sayısı.

ceil(): Yuvarlama fonksiyonu. Örneğin ceil(10.8) 11 sonucunu verir.

currentReplicas: Mevcut pod sayısı.

currentMetricValue: Mevcut durumda pod sayısına göre kullanılan ortalama metrik.

desiredMetricValue: Belirlenen sınır metrik.

Örneğin; sınır metrik değerini CPU üzerinden %60 olarak belirlediğimiz bir senaryoda minimum pod sayımızı 4 maximum pod sayımızı ise 15 olarak ayarladığımızı düşünelim. Mevcut durumda ise 9 podumuz olduğunu ve CPU kullanımının %65 olduğunu düşünürsek hesap şu şekilde olur.

desiredReplicas = ceil[9*(65/60)] = ceil(9,75) = 10 şeklinde olacaktır.

VPA ise verilen sınır metrik değerlere göre workload ların request ve limit değerleriyle oynayarak dikey şekilde genişlemesini sağlamaktadır.

clickittech.com

HPA’ yı faklı metrikler kullanarak scaling işlemi yapabilmek istersek burada karşımıza Event-Driven olarak autoscale yapmamıza olanak sağlayan KEDA çıkıyor. Bu yazımızda prometheus kullanarak elde ettiğimiz metrikler ile deployment scale etme örneğini göreceğiz.

KEDA aşağıdaki gibi helm3 kullanılarak hızlıca kurulabilir.

  1. Helm reposu ekleme
helm repo add kedacore https://kedacore.github.io/charts

2. Helm repo update

helm repo update

3. Keda helm chart yükleme

kubectl create namespace keda
helm install keda kedacore/keda --namespace keda

KEDA yüklendikten sonra ayağa kalkan podlarımızı kontrol etmeliyiz.

kubectl get pod -n keda
....
NAME READY STATUS RESTARTS
keda-operator-578fbd6599-nx9hz 1/1 Running 0
keda-operator-metrics-apiserver-78bb955fd8-th8jx 1/1 Running 0

Podlarımız bu şekilde running konumunda olduğunda sırada ScaledObject objesi yaratma işlemi var. Aşağıdaki yaml dosyasında gereken parametreleri şu şekilde girebiliriz.

triggers : scaler olarak tanımlayacağımız specific event source’u (prometheus)

scaleTargetRef: Scale etmek istediğimiz K8s resource’u (Deployment , Statefulset)

Trigger type olarak prometheus seçtiğimiz zaman aşağıdaki parametreleri şu şekilde girebiliriz.

metricName: uniqe bir metrik ismi

query: Prometheus üzerinden çekeceğimiz metrik için query

serverAddress: Prometheus server url’i

threshold: scale işleminin tetikleneceği eşik değeri

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: some-scaledobject-name
namespace: "your-namespace"
spec:
cooldownPeriod: 150
maxReplicaCount: 70
minReplicaCount: 20
pollingInterval: 15
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: some-deployment
triggers:
- metadata:
type: prometheus
metricName: istio_requests_total
query: >-
sum(rate(istio_requests_total{destination_workload_namespace="some-namespace",destination_workload="some-app",app="some-app"}
serverAddress: >-
http://your-prometheus-server.svc.cluster.local:9090
threshold: 'some'

Diğer parametreler ise şu anlamlara gelmektedir.

cooldownPeriod: En son tetiklenme sonrası default olan min. replica değerine düşmeden önceki bekleme süresi. Default olarak 5 dakika.

maxReplicaCount: Keda’nın HPA objesi oluşturup maxReplicas değerini setleyen parametre.

minReplicaCount: Keda’nın HPA objesi oluşturup minReplicas değerini setleyen parametre.

pollingInterval: Tetiklemeyi kontrol sıklığı. Default olarak 30 saniye.

kubectl kullanarak yaml dosyamızı apply ettikten sonra ve bir süre bekledikten sonra HPA objesinin otomatik create edildiğini görebiliriz. Bu şekilde prometheustan gelen metrik ve eşik değeri kullanılarak max ve min pod sayıları arasında scale olma işlemini gözlemleyebiliriz.

NAME                           REFERENCE         TARGETS             MINPODS   MAXPODS   REPLICAS
keda-hpa-app-scaledobject Deployment/app 170500m/220 (avg) 20 70 20

Sonuç olarak k8s metrikleri dışında scale işlemini Keda kullanarak farklı scaler tipleri ile scale işlemini trigger edebiliriz. Farklı scaler tipleri için https://keda.sh sitesini inceleyebilirsiniz.

Kaynaklar:

  • KEDA resmi sitesi

(https://keda.sh/)

  • KEDA kullanım örneği ve açıklaması

(https://www.youtube.com/watch?v=3lcaawKAv6s)

--

--