Membongkar arsitektur KEDA: operator yang mengelola ScaledObject dan ScaledJob, metrics server yang menyuplai metrik ke HPA, admission webhooks, serta komponen CRD utama dan peran 70 lebih scaler.

Di episode 1 kita sudah paham mengapa KEDA ada: menskalakan workload berdasarkan event, bukan CPU, dan menurunkan replika hingga nol saat tidak ada pekerjaan. Pertanyaan berikutnya yang wajar muncul adalah: bagaimana caranya?
Episode 2 membuka kap mesin. Kita akan melihat tiga komponen yang berjalan di namespace keda setelah install, memahami peran masing-masing, lalu berkenalan dengan objek-objek Custom Resource (CRD) yang akan kalian tulis terus-menerus di sisa seri ini.
Saat kalian install KEDA via Helm, ada tiga Deployment yang muncul: keda-operator, keda-metrics-server, dan keda-admission-webhooks. Masing-masing punya peran yang sangat berbeda.
Operator adalah otak KEDA. Ia menjalankan reconciliation loop khas pola operator Kubernetes: terus-menerus membandingkan kondisi nyata dengan apa yang dideklarasikan dalam CRD. Ketika kalian membuat ScaledObject atau ScaledJob, operator yang bertanggung jawab melakukan dua hal penting:
maxReplicaCount diubah.apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: order-worker-scaledobject
spec:
scaleTargetRef:
name: order-worker
minReplicaCount: 0
maxReplicaCount: 10
triggers:
- type: rabbitmq
metadata:
queueName: ordersPerhatikan: kalian tidak pernah membuat HPA secara manual untuk workload ini. HPA dibuat dan dikelola operator, dan perintah berikut akan menampilkannya:
kubectl get hpa
kubectl get scaledobject
kubectl describe scaledobject order-worker-scaledobjectKomponen kedua adalah keda-metrics-server. Ia mengimplementasikan External Metrics API Kubernetes. Ketika HPA (yang dibuat operator) butuh angka, ia bertanya ke keda-metrics-server, yang lalu menghubungi scaler yang sesuai untuk mengambil nilai aktual — misalnya panjang queue RabbitMQ — dan mengembalikannya dalam bentuk yang dipahami HPA.
Inilah alasan KEDA "menyatu" dengan ekosistem Kubernetes tanpa plugin tambahan: HPA tidak tahu dan tidak peduli bahwa datanya berasal dari Kafka atau SQS. Yang ia lihat hanyalah metrik eksternal bernama tertentu.
Komponen ketiga adalah keda-admission-webhooks. Seperti namanya, ia menyediakan endpoint webhook yang dipanggil Kubernetes setiap kali ada objek KEDA yang dibuat atau diubah. Tugasnya validasi: apakah nilai maxReplicaCount lebih besar dari minReplicaCount? Apakah nama scaler yang dipakai memang terdaftar? Jika tidak valid, objek ditolak sebelum sempat merusak state cluster.
Warning
Webhook adalah alasan kenapa kubectl apply -f my-scaledobject.yaml kadang gagal dengan pesan aneh meskipun YAML valid. Baca pesan error dari webhook dengan teliti — biasanya itu sudah menjelaskan field mana yang salah.
Untuk memahami betapa rapi desain KEDA, ikuti satu siklus permintaan metrik dari awal sampai akhir:
ScaledObject baru, lalu membuat HPA yang menargetkan deployment milik kalian.pollingInterval, HPA meminta nilai metrik eksternal ke keda-metrics-server.threshold dari trigger.RabbitMQ --> keda-metrics-server --> External Metrics API --> HPA --> DeploymentKunci dari seluruh alur ini: HPA tetap menjadi satu-satunya pengambil keputusan final. KEDA hanya menyediakan data yang lebih relevan. Karena itulah perilaku naik-turun replika masih bisa disetel lewat mekanisme HPA seperti behavior untuk scaleUp dan scaleDown — akan kita bahas di episode 11.
Semua konfigurasi KEDA dilakukan lewat empat Custom Resource. Menguasai keempatnya berarti menguasai 80 persen KEDA.
ScaledObject (disertai scaledobjects.keda.sh) mengatur autoscaling untuk workload berkelanjutan seperti Deployment, StatefulSet, atau ReplicaSet. Field utamanya adalah scaleTargetRef (menunjuk workload), pollingInterval, cooldownPeriod, minReplicaCount, maxReplicaCount, dan triggers. Episode 4 membahasnya tuntas.
ScaledJob mengatur autoscaling Job (Kubernetes Jobs untuk workload batch). Beda mendasarnya dengan ScaledObject: alih-alih menambah/mengurangi replika pod yang sudah ada, KEDA membuat Job baru ketika ada event — perilaku yang lebih cocok untuk satu-satunya tugas yang punya awal dan akhir.
Sebagian besar scaler memerlukan kredensial untuk mengakses sumber event — misalnya secret SQS atau certificate Kafka. Kredensial itu didefinisikan di TriggerAuthentication (berlaku di satu namespace) atau ClusterTriggerAuthentication (berlaku lintas namespace), lalu dirujuk dari triggers di ScaledObject. Seluk-beluknya kita bedah di episode 6.
Bagian yang membuat KEDA begitu menarik: koleksi scaler yang sudah jadi. Setiap scaler adalah implementasi untuk satu sumber metrik spesifik:
spec:
triggers:
- type: prometheus
metadata:
serverAddress: http://prometheus.monitoring:9090
query: sum(rate(worker_processed_total[2m]))
threshold: "10"
- type: cron
metadata:
timezone: Asia/Jakarta
start: "0 8 * * *"
end: "0 18 * * *"Pada tahun 2026, koleksinya sudah lebih dari 70 scalers, dan bisa dikelompokkan berdasarkan kategori:
| Kategori | Contoh Scaler |
|---|---|
| Queue & Stream | SQS, Kafka, RabbitMQ, Redis Streams, NATS JetStream |
| Cloud queue | Azure Service Bus, GCP Pub/Sub |
| Observability | Prometheus, Grafana |
| HTTP | HTTP Add-on (pending requests) |
| Database | PostgreSQL, MySQL, MongoDB, Redis list |
| Jadwal | cron (predictive) |
| Resource | CPU, memory |
| Lainnya | GitHub, external-push |
Seluruh daftar resmi selalu bisa dicek di dokumentasi keda.sh. Tiga komponen arsitektur tadi ditambah empat CRD ini adalah satu paket yang akan kalian gunakan di setiap episode berikutnya.
Episode 2 memberi peta arsitektur KEDA. Berikut yang wajib kalian bawa:
Di episode 3 kita turun ke lapangan: instalasi KEDA dari awal dengan Helm, opsi konfigurasi via --set, dan alternatif instalasi berbasis manifest untuk alur GitOps.