M3 E2E 실증 — KEDA Kafka burst scaling (#1430)
bytewax-anomaly-scaledobject KEDA ScaledObject 가 Prometheus 의 kafka_consumergroup_lag 메트릭으로 gend-streaming-anomaly Deployment 를 1↔N replica 자동 확장하는 인프라의 prod 실증.
운영 회귀 3건 + Fix
회귀 1 — ServiceMonitor 미설치
PR #1396 가 kafka-exporter Helm install 했지만 serviceMonitor.enabled=true 가 prod 에서 효과 없음 — kubectl get servicemonitor -n gend 결과에 kafka-exporter 부재. Prometheus 의 kafka_consumergroup_lag 쿼리 결과 빈 vector.
Fix (본 PR infra/kafka-exporter/servicemonitor.yaml):
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: kafka-exporter
namespace: gend
labels:
release: kube-prometheus-stack
spec:
selector:
matchLabels:
app: prometheus-kafka-exporter
release: kafka-exporter
namespaceSelector: { matchNames: [gend] }
endpoints:
- port: exporter-port
interval: 30s
scrapeTimeout: 10s
운영 적용:
kubectl apply -f infra/kafka-exporter/servicemonitor.yaml
kubectl exec -n kube-prometheus-stack prometheus-kube-prometheus-stack-prometheus-0 \
-c prometheus -- wget --post-data="" -qO- http://localhost:9090/-/reload
검증 — 30초 후 kafka_consumergroup_lag 메트릭 6개 시리즈 노출 (consumergroups: kogas-lng-worker, ml-walkthrough-worker).
회귀 2 — ServiceMonitor 라벨 release: prometheus
infra/kafka-exporter/values.yaml 의 serviceMonitor.additionalLabels.release: prometheus 가 prod prometheus operator 의 serviceMonitorSelector.matchLabels.release=kube-prometheus-stack 와 불일치 (그래서 Helm chart 가 만든 ServiceMonitor 도 운영 시 prometheus 에서 안 보였음 — 추측).
Fix (본 PR infra/kafka-exporter/values.yaml):
additionalLabels:
app.kubernetes.io/component: metrics
- release: prometheus # prometheus-operator label selector
+ release: kube-prometheus-stack
다음 helm upgrade 시 적용.
회귀 3 — ScaledObject prometheus address / consumergroup / topic 패턴 불일치
infra/keda/scaledobjects/bytewax-anomaly-scaledobject.yaml:
| Field | 옛 값 | 실제 prod 값 |
|---|---|---|
| serverAddress | http://prometheus-server.monitoring.svc:80 | http://kube-prometheus-stack-prometheus.kube-prometheus-stack.svc:9090 |
| consumergroup | bytewax-anomaly | gend-streaming-anomaly |
| topic 패턴 | anomaly.* | source-db.public.operating_event.* |
Fix (본 PR) — manifest 의 query 3건 모두 prod 실제값 정렬.
운영 적용:
kubectl apply -f infra/keda/scaledobjects/bytewax-anomaly-scaledobject.yaml
결과
$ kubectl get scaledobject -n gend bytewax-anomaly-scaledobject
NAME SCALETARGETKIND MIN MAX TRIGGERS READY ACTIVE
bytewax-anomaly-scaledobject apps/v1.Deployment 1 4 prometheus True False
READY=True (fix 전 False).
ACTIVE=False — 현재 gend-streaming-anomaly consumer group 이 kafka_consumergroup_lag 메트릭에 존재하지 않음 (consumer 가 아직 한번도 commit 안 한 신규 group 일 가능성, 또는 source-db.public.operating_event.* topic 이 미가동). burst E2E (1→N scale-up trace + idle 후 scale-down) 는 별도 follow-up:
- dedicated test consumer group + test topic 발행 → lag 의도 발생
- 또는 source-db CDC pipeline 활성화로 자연스러운 lag 발생 관찰
검증 명령 (현장)
# 1. ServiceMonitor + Service 매칭
kubectl get servicemonitor kafka-exporter -n gend
kubectl get svc kafka-exporter-prometheus-kafka-exporter -n gend -o jsonpath='{.metadata.labels}'
# 2. prometheus targets — kafka-exporter pod 가 up 인지
kubectl exec -n kube-prometheus-stack prometheus-kube-prometheus-stack-prometheus-0 \
-c prometheus -- wget -qO- http://localhost:9090/api/v1/targets?state=active \
| grep kafka-exporter
# 3. kafka_consumergroup_lag 메트릭 노출
kubectl exec -n kube-prometheus-stack prometheus-kube-prometheus-stack-prometheus-0 \
-c prometheus -- wget -qO- 'http://localhost:9090/api/v1/query?query=kafka_consumergroup_lag'
# 4. ScaledObject READY
kubectl get scaledobject -n gend bytewax-anomaly-scaledobject
# 5. KEDA hpa (자동 생성)
kubectl get hpa keda-hpa-bytewax-anomaly-scaledobject -n gend
회귀 가드 후보 (별도 follow-up issue)
- (1) ServiceMonitor 자동 생성 검증 CI: PR #1396 의 helm install 후
kubectl get servicemonitor가 비어있지 않는지. - (2) ScaledObject manifest lint: serverAddress 가 cluster 실제 prometheus svc 와 일치하는지 (env-별 strict matrix).
- (3) consumer group / topic 패턴 lint: ScaledObject 가 실제 deployment env 의
*_CONSUMER_GROUP/*_SOURCE_TOPICConfigMap 값과 정렬되는지 (template 변수 대신 string literal 사용 시 사전 grep).