본문으로 건너뛰기

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.yamlserviceMonitor.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 값
serverAddresshttp://prometheus-server.monitoring.svc:80http://kube-prometheus-stack-prometheus.kube-prometheus-stack.svc:9090
consumergroupbytewax-anomalygend-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_TOPIC ConfigMap 값과 정렬되는지 (template 변수 대신 string literal 사용 시 사전 grep).