본문으로 건너뛰기

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결과
1kafka-exporter ServiceMonitor 미설치infra/kafka-exporter/servicemonitor.yaml 직접 manifestprometheus scrape OK
2ServiceMonitor 라벨 release: prometheus (operator selector 와 불일치)release: kube-prometheus-stack 으로 정렬discovery OK
3ScaledObject serverAddress/consumergroup/topic 모두 staleprod 실제 값으로 정렬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)
  • consumergroup literal 이 같은 Deployment 의 ConfigMap GEND_STREAMING_CONSUMER_GROUP 와 정렬
  • topic regex 가 같은 Deployment 의 ConfigMap GEND_STREAMING_SOURCE_TOPIC 와 match
  • release: 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)