KEDA Nedir?

KEDA (Kubernetes-based Event-Driven Autoscaling) bir Kubernetes (K8s) uygulaması olarak çalışır ve K8s clusterlerinde event-driven scaling (olay bazlı ölçeklendirme) sağlar. Bu, uygulamaların dinamik olarak yüklerine göre ölçeklendirilebilmesini sağlar.

keda

KEDA, uygulamanızın birçok farklı kaynaktan olayları dinleyebildiği için çok yönlü bir araçtır. Örneğin, bir HTTP isteği, bir message queue veya bir IoT cihazından gelen bir veriyi scaling işlemlerinde kullanabilir. KEDA, bu olayları dinler ve uygulamanızın yüküne göre ölçeklendirir. Bu, uygulamanızın daha yüksek performans ve daha düşük maliyetle çalışmasını sağlar.

KEDA’yı kurmak için Helm kullanabilirsiniz. Helm, K8s cluster’larına paketler (örneğin uygulamalar ve hizmetler) yüklemek için kullanılan bir araçtır. Öncelikle, Helm’i kurmanız gerekir. Bunu yapmak için aşağıdaki komutu kullanabilirsiniz:

curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash

Daha sonra, KEDA’yı Helm ile kurmak için aşağıdaki komutu kullanabilirsiniz:

helm repo add kedacore https://kedacore.github.io/charts
helm install keda kedacore/keda

Bu komutlar, KEDA’yı clusterinize kurar ve tüm gereken K8s objelerini oluşturur.

KEDA’yı kullanmak için, uygulamanızı KEDA ile birlikte çalıştıracak şekilde yapılandırmanız gerekir. Bu, uygulamanızın bir “ScaledObject” olarak tanımlanmasını gerektirir. ScaledObject, uygulamanızın nasıl ölçeklendirileceğini belirtir. Örneğin, uygulamanızın bir HTTP isteği aldığında veya bir message queue mesajı aldığında ölçeklendirileceğini belirtebilirsiniz. ScaledObject ayrıca, uygulamanızın hangi koşullar altında ölçeklendirileceğini de belirtir. Örneğin, uygulamanızın CPU kullanımı yüksek olduğunda veya bellek kullanımı yüksek olduğunda ölçeklendirileceğini belirtebilirsiniz.

Belirli bir zaman aralığında yüksek CPU kullanımı olan bir uygulamanın ölçeklendirilmesi

apiVersion: keda.k8s.io/v1alpha1
kind: ScaledObject
metadata:
  name: my-scaledobject
spec:
  scaleTargetRef:
    deploymentName: my-deployment
  triggers:
  - type: periodic
    metadata:
      interval: "30s"
    scaleMetric:
      type: cpu
      resourceName: my-service
      targetAverageUtilization: 75

Bu ScaledObject, “my-deployment” adlı bir deployment’ı her 30 saniyede bir kez ölçeklendirir ve bu deployment’ın CPU kullanımı yüksek olduğunda ölçeklendirme yapar. Ölçeklendirme için, “my-service” adlı bir hizmetin ortalama CPU kullanımının %75’in üstünde olması gerekir.

HTTP isteklerine göre ölçeklendirilen bir uygulamanın ölçeklendirilmesi

apiVersion: keda.k8s.io/v1alpha1
kind: ScaledObject
metadata:
  name: my-scaledobject
spec:
  scaleTargetRef:
    deploymentName: my-deployment
  triggers:
  - type: httptrigger
    metadata:
      method: POST
      url: http://my-service/users
    scaleMetric:
      type: httprate
      resourceName: my-service
      targetAverageValue: 10
      maxScaleOutRate: 5
      minScaleInRate: 1
      cooldownPeriod: "30s"

Bu ScaledObject, “my-deployment” adlı bir deployment’ı HTTP isteklerine göre ölçeklendirir ve bu deployment’ın isteklerin ortalama sayısı yüksek olduğunda ölçeklendirme yapar. Ölçeklendirme için, “my-service” adlı bir hizmetin ortalama istek sayısının 10’tan fazla olması gerekir. Ayrıca, bu ScaledObject aynı zamanda ölçeklendirme hızını kısıtlar ve ölçeklendirme sonrası bir “cooldown” periyodu belirtir. Bu, ölçeklendirme işleminin birkaç kez arka arkaya yapılmasını önler ve uygulamanın performansını korur.

Bir message queue’dan gelen mesajları dinleyen ve bu mesajların sayısına göre ölçeklendirilen bir uygulamanın ölçeklendirilmesi

apiVersion: keda.k8s.io/v1alpha1
kind: ScaledObject
metadata:
  name: my-scaledobject
spec:
  scaleTargetRef:
    deploymentName: my-deployment
  triggers:
  - type: mqtrigger
    metadata:
      queueName: my-queue
      connectionString: "amqp://user:password@localhost:5672/vhost"
      authMode: plain
    scaleMetric:
      type: messagecount
      resourceName: my-queue
      targetAverageValue: 1000
      maxScaleOutRate: 5
      minScaleInRate: 1
      cooldownPeriod: "30s"

Bu ScaledObject, “my-deployment” adlı bir deployment’ı “my-queue” adlı bir message queue’dan gelen mesajları dinleyerek ölçeklendirir ve bu queue’daki mesaj sayısı yüksek olduğunda ölçeklendirme yapar. Ölçeklendirme için, “my-queue” adlı bir message queue’daki ortalama mesaj sayısının 1000’ten fazla olması gerekir. Ayrıca, bu ScaledObject aynı zamanda ölçeklendirme hızını kısıtlar ve ölçeklendirme sonrası bir “cooldown” periyodu belirtir.

Bir IoT cihazından gelen verilere göre ölçeklendirilen bir uygulamanın ölçeklendirilmesi

apiVersion: keda.k8s.io/v1alpha1
kind: ScaledObject
metadata:
  name: my-scaledobject
spec:
  scaleTargetRef:
    deploymentName: my-deployment
  triggers:
  - type: iotdevice
    metadata:
      connectionString: "HostName=my-iot-hub.azure-devices.net;DeviceId=my-device;SharedAccessKey=XYZ"
    scaleMetric:
      type: devicetelemetry
      resourceName: my-device
      targetAverageValue: 75
      metricName: "temperature"
      maxScaleOutRate: 5
      minScaleInRate: 1
      cooldownPeriod: "30s"

Bu ScaledObject, “my-deployment” adlı bir deployment’ı “my-device” adlı bir IoT cihazından gelen verilere göre ölçeklendirir ve bu cihazdan gelen “temperature” adlı bir verinin değeri yüksek olduğunda ölçeklendirme yapar. Ölçeklendirme için, “my-device” adlı bir IoT cihazından gelen ortalama “temperature” değerinin 75’ten fazla olması gerekir. Ayrıca, bu ScaledObject aynı zamanda ölçeklendirme hızını kısıtlar ve ölçeklendirme sonrası bir “cooldown” periyodu belirtir.

Bir veritabanı tablosundaki satır sayısına göre ölçeklendirilen bir uygulamanın ölçeklendirilmesi

apiVersion: keda.k8s.io/v1alpha1
kind: ScaledObject
metadata:
  name: my-scaledobject
spec:
  scaleTargetRef:
    deploymentName: my-deployment
  triggers:
  - type: dbpoller
    metadata:
      connectionString: "Server=my-server;Database=my-db;User Id=my-user;Password=my-password;"
      query: "SELECT COUNT(*) FROM my-table"
      pollInterval: "30s"
    scaleMetric:
      type: custom
      resourceName: my-table
      targetAverageValue: 100000
      maxScaleOutRate: 5
      minScaleInRate: 1
      cooldownPeriod: "30s"

Bu ScaledObject, “my-deployment” adlı bir deployment’ı veritabanı tablosu “my-table” için her 30 saniyede bir kez sorgu çalıştırarak ölçeklendirir ve bu tablonun satır sayısı yüksek olduğunda ölçeklendirme yapar. Ölçeklendirme için, “my-table” adlı veritabanı tablosundaki ortalama satır sayısının 100000’ten fazla olması gerekir. Ayrıca, bu ScaledObject aynı zamanda ölçeklendirme hızını kısıtlar ve ölçeklendirme sonrası bir “cooldown” periyodu belirtir.

Bir dosya sistemindeki dosya sayısına göre ölçeklendirilen bir uygulamanın ölçeklendirilmesi

apiVersion: keda.k8s.io/v1alpha1
kind: ScaledObject
metadata:
  name: my-scaledobject
spec:
  scaleTargetRef:
    deploymentName: my-deployment
  triggers:
  - type: fsnotify
    metadata:
      directoryPath: "/path/to/my/directory"
      fileType: .csv
    scaleMetric:
      type: filecount
      resourceName: my-directory
      targetAverageValue: 10000
      maxScaleOutRate: 5
      minScaleInRate: 1
      cooldownPeriod: "30s"

Bu ScaledObject, “my-deployment” adlı bir deployment’ı “my-directory” adlı bir dosya sistemi klasörünü dinleyerek ölçeklendirir ve bu klasörde “.csv” tipli dosyaların sayısı yüksek olduğunda ölçeklendirme yapar. Ölçeklendirme için, “my-directory” adlı dosya sistemi klasöründeki ortalama “.csv” dosya sayısının 10000’ten fazla olması gerekir. Ayrıca, bu ScaledObject aynı zamanda ölçeklendirme hızını kısıtlar ve ölçeklendirme sonrası bir “cooldown” periyodu belirtir.

Ayrıca Kubernetes HPA ile ilgili bu yazımı da inceleyebilirsiniz.