Kubernetes'te KEDA ile Otomatik Pod Ölçekleme: Adım Adım Kurulum ve Örnekler

Kubernetes üzerinde çalışan uygulamalar zaman zaman yoğun trafik alabilir. Bu durumlarda uygulamanın yük altında kalmadan esnek şekilde büyüyüp küçülmesi çok önemlidir. Kubernetes'in yerleşik HorizontalPodAutoscaler
(HPA) özelliği bunun için güzel bir başlangıç sunar. Ancak HPA genellikle sadece CPU ve RAM gibi temel metriklerle sınırlıdır.
İşte tam burada devreye KEDA (Kubernetes-based Event Driven Autoscaler) giriyor. KEDA, Prometheus, Kafka, Redis, RabbitMQ gibi pek çok kaynaktan gelen metriklere göre uygulamanızı otomatik olarak ölçeklendirebilir.
Bu yazıda, KEDA’nın Kubernetes ortamına nasıl kurulacağını, nelere dikkat edilmesi gerektiğini ve örnek ScaledObject
konfigürasyonlarıyla nasıl kullanılacağını göstereceğim.
Ön Koşul: Metrics Server Kurulu mu?
KEDA'nın cpu
tabanlı metriklerle çalışabilmesi için Kubernetes ortamında Metrics Server yüklü olmalı. Kontrol etmek için:
kubectl get apiservices | grep metrics
Yoksa kurmak için şu komutu kullanabilirsin:
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
Eğer TLS hataları alırsan (örneğin self-signed sertifika nedeniyle), Deployment’a --kubelet-insecure-tls
argümanını eklemen gerekebilir:
containers:
- name: metrics-server
args:
- --kubelet-insecure-tls
YAML’yi indirip düzenledikten sonra deploy etmen yeterli.
KEDA Kurulumu (Helm ile)
Öncelikle Helm repository ekleyelim ve KEDA’yı yükleyelim:
helm repo add kedacore https://kedacore.github.io/charts
helm repo update
helm install keda kedacore/keda \
--namespace keda \
--create-namespace \
--version 2.17.1
Kurulum sonrası pod’ların durumunu kontrol edebilirsin:
kubectl get pods -n keda
Pod’lar Running
olduktan sonra KEDA kullanıma hazırdır.
Örnek ScaledObject: CPU Temelli Otomatik Ölçekleme
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: nginx-scaledobject
namespace: echo-test # <-- Uygulamanın bulunduğu namespace
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx-deployment # <-- Ölçeklenecek Deployment adı
minReplicaCount: 1
maxReplicaCount: 6
pollingInterval: 20 # Her 20 saniyede metrik kontrol edilir
cooldownPeriod: 60 # Ölçeklendirme sonrası en az 60 saniye beklenir
advanced:
horizontalPodAutoscalerConfig:
behavior:
scaleUp:
stabilizationWindowSeconds: 60
policies:
- type: Pods
value: 1
periodSeconds: 60
scaleDown:
stabilizationWindowSeconds: 60
policies:
- type: Pods
value: 1
periodSeconds: 60
triggers:
- type: cpu
metadata:
type: Utilization
value: "75" # %75 CPU kullanımına ulaşınca scale up
Prometheus Tabanlı Ölçekleme
KEDA, Prometheus üzerinden özel metriklerle de çalışabilir. Aşağıdaki örnek, belirli bir band genişliği değerine göre pod sayısını artırır:
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: nginx-scaledobject
namespace: echo-test
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx-deployment
minReplicaCount: 1
maxReplicaCount: 6
pollingInterval: 20
cooldownPeriod: 60
advanced:
horizontalPodAutoscalerConfig:
behavior:
scaleUp:
stabilizationWindowSeconds: 60
policies:
- type: Pods
value: 1
periodSeconds: 60
scaleDown:
stabilizationWindowSeconds: 60
policies:
- type: Pods
value: 1
periodSeconds: 60
triggers:
- type: prometheus
metadata:
serverAddress: http://prometheus-server.monitoring.svc.cluster.local:80
metricName: nginx_bandwidth_per_pod
threshold: "12192" # Byte/s gibi düşünülebilir
query: |
sum(rate(container_network_receive_bytes_total{namespace="echo-test", pod=~"nginx-deployment.*"}[5m]))
KEDA ile uygulamalarını CPU, özel Prometheus metrikleri ve birçok başka kaynakla birlikte esnek bir şekilde ölçeklendirebilirsin. Üstelik kurulumu oldukça basit, YAML tanımları da oldukça açık.
Uygulaman beklenenden fazla trafik almaya başladığında artık senin yerine otomatik olarak büyüyebilecek. Gerektiğinde de geri çekilecek.