İçerik
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, 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.