Bytewax Streaming KEDA Autoscaling (#1283 Gap 4 M3)
infra/keda/scaledobjects/bytewax-anomaly-scaledobject.yaml — Kafka consumer lag + CPU 기반 자동 수평 스케일링.
디자인 결정
1. 왜 2개 트리거 (lag + CPU)?
- Kafka lag (primary): 실 트래픽 burst 감지. lag 100+ → scale-up
- CPU (secondary): Bytewax 단일 instance 가 처리 한계 (CPU 70%+) 도달 시 scale-up
- 둘 중 어느 쪽이든 활성화되면 KEDA 가 desired replicas 증가
2. 왜 min=1?
- Kafka consumer 가 0 일 때 broker 가 lag metric 노출 안 함 → KEDA 가 scale 결정 불가
minReplicaCount: 1cold consumer 안전망
3. 왜 cooldown=300s?
- Bytewax flow 가 정상 종료 시 Kafka offset commit + 처리 중 메시지 완료 필요
- scaleDown stabilization 300s (5분) — 진행 중 작업 보장
- preStop hook (sleep 2s) 와 합쳐 graceful shutdown
ScaledObject 핵심
spec:
scaleTargetRef:
name: gend-streaming-anomaly
minReplicaCount: 1
maxReplicaCount: 4
pollingInterval: 15
cooldownPeriod: 300
advanced:
horizontalPodAutoscalerConfig:
behavior:
scaleUp:
stabilizationWindowSeconds: 60
policies: [{type: Pods, value: 1, periodSeconds: 60}]
scaleDown:
stabilizationWindowSeconds: 300
policies: [{type: Pods, value: 1, periodSeconds: 120}]
triggers:
- type: prometheus
metadata:
serverAddress: http://prometheus-server.monitoring.svc:80
query: kafka_consumergroup_lag{consumergroup="bytewax-anomaly"}
threshold: "100"
- type: prometheus
metadata:
query: avg(rate(container_cpu_usage_seconds_total{pod=~"gend-streaming-anomaly.*"}[5m])) * 100
threshold: "70"
종속성
- KEDA operator (#1353):
kedans 에 Helm install - kafka-exporter (#1357): Prometheus 가
kafka_consumergroup_lagscrape 가능해야 함 - Prometheus (monitoring/prometheus): ServiceMonitor 통해 kafka-exporter scrape
트러블슈팅
| 증상 | 원인 | 해결 |
|---|---|---|
HPA TARGETS <unknown>/100 | kafka-exporter 미배포 | #1357 PR infra/kafka-exporter/install.sh 실행 |
| Scale-up 안 함 (lag 100+ 인데도) | KEDA Operator → Prometheus 연결 실패 | kubectl logs -n keda keda-operator-* 에서 PromQL 에러 확인 |
| Scale-down 너무 빠름 | cooldownPeriod 짧음 | cooldownPeriod: 600 으로 증가 |
| Multiple pods 충돌 (offset duplicate) | partition 수 < replicaCount | Kafka topic partition 수 ≥ maxReplicaCount 보장 |