KEDA Bytewax Anomaly Worker — Kafka lag burst E2E (#1435)
bytewax-anomaly-scaledobject 가 Prometheus 의 kafka_consumergroup_lag 메트릭으로
gend-streaming-anomaly Deployment 를 1↔4 replica 자동 확장하는 운영 절차서.
#1430 / PR #1431 의 인프라 fix (ServiceMonitor 라벨 + ScaledObject endpoint/group/topic
정렬) 가 완료되어 ScaledObject 가 Ready=True 상태. burst 실 트레이스가 본 문서의
범위.
현 상태 (#1435 작업 시점)
$ kubectl --context aks-genos-prod -n gend get scaledobject bytewax-anomaly-scaledobject
NAME SCALETARGETKIND MIN MAX TRIGGERS READY ACTIVE
bytewax-anomaly-scaledobject apps/v1.Deployment 1 4 prometheus True False
$ kubectl --context aks-genos-prod -n gend get hpa keda-hpa-bytewax-anomaly-scaledobject
NAME TARGETS MINPODS MAXPODS REPLICAS
keda-hpa-bytewax-anomaly-scaledobject 0/100 (avg), 1687m/70 (avg) 1 4 1
Ready=True— KEDA operator 가 prometheus 쿼리 OK (#1430 fix 효과 확인)s0-prometheus= Kafka consumer lag trigger (현재 0)s1-prometheus= Pod CPU avg trigger (현재 168.7% — threshold 70 초과)REPLICAS=1— min=1, CPU trigger 활성이지만 첫 pod 가 lag 처리 못해 추가 pod 의미 X
진짜 burst E2E — dedicated test consumer 절차
prod CDC topic (source-db.public.operating_event) 에 burst 주입은 위험.
dedicated test consumer + test topic 으로 안전 시뮬레이션.
1. Test topic 생성
KAFKA_POD=$(kubectl --context aks-genos-prod -n gend get pod -l app=kafka -o jsonpath='{.items[0].metadata.name}')
kubectl --context aks-genos-prod -n gend exec $KAFKA_POD -c kafka -- \
/opt/kafka/bin/kafka-topics.sh --bootstrap-server localhost:9092 \
--create --topic anomaly.test.burst \
--partitions 4 --replication-factor 3
2. Test consumer Deployment
gend-streaming-anomaly-test Deployment — gend-streaming-anomaly 와 동일 image,
env override 만 다름:
- name: GEND_STREAMING_SOURCE_TOPIC
value: anomaly.test.burst
- name: GEND_STREAMING_CONSUMER_GROUP
value: gend-streaming-anomaly-test
- name: GEND_STREAMING_KSERVE_ENDPOINT
# KServe 호출 안 하게 mock or no-op endpoint
value: http://localhost:9999
3. Test ScaledObject (별도 manifest)
bytewax-anomaly-test-scaledobject — query 의 consumergroup/topic 만 test 값으로:
metadata:
query: sum(kafka_consumergroup_lag{namespace="gend",consumergroup="gend-streaming-anomaly-test",topic=~"anomaly.test.burst.*"})
4. Burst 주입
kubectl --context aks-genos-prod -n gend exec -it $KAFKA_POD -c kafka -- bash -c '
for i in $(seq 1 30000); do
echo "{\"event_id\":\"$i\",\"value\":$RANDOM}"
done | /opt/kafka/bin/kafka-console-producer.sh \
--bootstrap-server localhost:9092 \
--topic anomaly.test.burst \
--producer-property compression.type=gzip
'
5. Trace
# HPA replicas 변화 추적
kubectl --context aks-genos-prod -n gend get hpa keda-hpa-bytewax-anomaly-test-scaledobject -w
# 30초 안에 1 → 2 → 4 까지 scaleup 기대
# 5min idle 후 1 로 scale-down 기대 (cooldownPeriod=300)
6. 정리
kubectl --context aks-genos-prod -n gend delete scaledobject bytewax-anomaly-test-scaledobject
kubectl --context aks-genos-prod -n gend delete deploy gend-streaming-anomaly-test
kubectl --context aks-genos-prod -n gend exec $KAFKA_POD -c kafka -- \
/opt/kafka/bin/kafka-topics.sh --bootstrap-server localhost:9092 \
--delete --topic anomaly.test.burst
#1430 사이클 회고 — 운영 회귀 3건 fix
| # | 회귀 | Fix | 결과 |
|---|---|---|---|
| 1 | kafka-exporter ServiceMonitor 미설치 | infra/kafka-exporter/servicemonitor.yaml 직접 manifest | prometheus scrape OK |
| 2 | ServiceMonitor 라벨 release: prometheus (operator selector 와 불일치) | release: kube-prometheus-stack 으로 정렬 | discovery OK |
| 3 | ScaledObject serverAddress/consumergroup/topic 모두 stale | prod 실제 값으로 정렬 | Ready=True |
회귀 가드 — CI lint (PR #1441 본 PR 산출물)
scripts/test_cross_pr_consistency.py::test_keda_scaledobject_query_targets_real_resources:
- ScaledObject 의
serverAddress가 K8s 에 실존하는 Service 형태 (FQDN+port) consumergroupliteral 이 같은 Deployment 의 ConfigMapGEND_STREAMING_CONSUMER_GROUP와 정렬topicregex 가 같은 Deployment 의 ConfigMapGEND_STREAMING_SOURCE_TOPIC와 matchrelease: kube-prometheus-stack라벨 강제 (prometheus operator selector 와 일치)
트러블슈팅
Ready=False, BadResponse
→ KEDA operator 의 prometheus query 가 fail. serverAddress 가 실제 svc 와 맞는지 확인:
kubectl --context aks-genos-prod -n kube-prometheus-stack get svc | grep prometheus
Active=False 인데 Ready=True
→ 메트릭 시리즈가 prometheus 에 없음 (consumer group / topic 이 한번도 commit/produce 안 됨). test consumer 가 잠시 lag=0 으로 join 했다가 떠야 메트릭 시리즈 생성됨.
kafka_consumergroup_lag 메트릭 빈 vector
→ ServiceMonitor 가 prometheus 에 등록 안 됨. ServiceMonitor 의 release 라벨이
prometheus operator 의 serviceMonitorSelector.matchLabels.release 와 정확히 일치하는지 확인.
관련 PR / Issue
- PR #1431 — #1430 옵션 B 결과 + 운영 회귀 3건 fix (manifest)
- PR #1441 (본 PR) — KEDA burst E2E 운영 가이드 + cross-PR consistency 회귀 가드
- #1396 — kafka-exporter Helm install (선행)
- #1435 — 본 운영 가이드 + 회귀 가드 (closes by 본 PR)