لو 8 microservices بتاكل 24 pod طول اليوم وفيهم 3 بس اللي عنده شغل وقت الذروة، الفاتورة بتاعتك بتدفع لـ idle بنسبة تتجاوز 60%. KEDA بيخلّي عدد الـ pods يتربط بـ Kafka consumer lag مباشرةً بدل CPU، فبتدفع للشغل الحقيقي بس.
KEDA: ازاي تـ scale من lag بدل ما تحرق فلوس على CPU
المشكلة باختصار
HPA الافتراضي في Kubernetes بيتحرّك على CPU/memory. تخيّل consumer بيقرأ من Kafka topic وفيه backlog 50K رسالة، الـ CPU ممكن يقعد 30% بس لأن الـ consumer بيسحب batch صغير ومتنظر I/O. HPA بيقول "الكل تمام"، والـ lag بيكبر، وبتفقد SLA الـ end-to-end latency بدون ما تاخد بال.
الـ HPA مصمّم لـ workload synchronous (HTTP request/response). Kafka workload async، والـ signal الحقيقي مش CPU، هو الـ lag.
قبل ما ندخل في العلم: مثال بسيط جدا
تخيّل عيادة فيها 5 أطباء قاعدين دايماً ومستنّيين. صاحب العيادة بيدفع رواتب 5 طول الـ 24 ساعة. لو 3 منهم بياخدوا شغل وقت الذروة بس، انت بتدفع 40% فلوس مش بتاخد قيمتها. الحل المنطقي: شغّل بنظام call. كل ما يطول طابور الانتظار في الاستقبال، استدعِ دكتور إضافي. ولّما الطابور يفضى، خلّي 1 بس متاح.
KEDA بيعمل نفس الفكرة على pods: بدل ما تحجز 5 pods دايماً، بتشيك على "طابور الانتظار" (Kafka lag، RabbitMQ queue، Redis stream، 60+ مصدر مدعوم) وبتشغّل اللي محتاجه بالظبط. لو الطابور فضي، بينزل لـ صفر pods (لو إنت سامح). ده بالظبط هو event-driven autoscaling.
التعريف العلمي الدقيق
KEDA (Kubernetes Event-Driven Autoscaler) مشروع graduated في CNCF منذ 2023، بيشتغل كـ controller جوّا الـ cluster بيستخدم Custom Resource اسمه ScaledObject. الـ ScaledObject بيحدد:
- الـ Deployment أو StatefulSet اللي هتعمله scale.
- الـ trigger (Kafka, Prometheus, AWS SQS, Redis، 60+ scaler).
- min/max replicas، فترة الـ polling، فترة cooldown قبل scale down.
الفرق المعماري عن HPA الكلاسيكي: KEDA بيشتغل layer فوق HPA. بيخلق ScaledObject → بيخلق HPA تلقائياً، وبيغذّيه external metrics من الـ scaler. بالإضافة لميزة scale-to-zero اللي HPA لوحده ميقدرش يعملها لأن minReplicas في HPA بتبدأ من 1.
إعداد عملي: scale Kafka consumer من lag
الـ stack: Kafka 3.7، KEDA 2.13، deployment Python يستخدم confluent-kafka-python. الهدف: لو lag على topic orders أكبر من 100 رسالة لكل pod، اعمل scale up. لو الـ topic فاضي 5 دقايق، انزل لـ صفر.
تثبيت KEDA: