🎯 KEDA - 쿠버네티스 이벤트 기반 오토스케일링

📑 목차


1. 개요

💡 KEDA란?

KEDA (Kubernetes Event-Driven Autoscaling)

외부 이벤트 소스 메트릭 기반으로 Pod 수량을 자동 조절하는 쿠버네티스용 오토스케일러

  • CNCF 프로젝트 (Microsoft 주도 기여)
  • 핵심 기능: 0개까지 스케일 다운 가능 (비용 절감)

📊 기존 HPA vs KEDA 비교

항목HPA (기존)KEDA
메트릭 소스CPU/Memory만60+ 외부 소스 지원
최소 Pod1개0개 (Scale to Zero)
스케일링 기준리소스 사용률이벤트 수 / 큐 길이 등
설정 복잡도낮음중간

🎯 주요 사용 사례

시나리오설명
메시지 큐 ConsumerKafka lag에 따라 Consumer Pod 자동 조절
배치 작업작업 없을 때 0개, 작업 들어오면 자동 확장
비용 최적화트래픽 없는 시간대 Pod 0개로 축소
이벤트 처리이벤트 발생량에 비례한 처리 용량 확보

2. 핵심 구성요소

📋 아키텍처

┌─────────────────────────────────────────────────────────────┐
│                      KEDA Operator                          │
├─────────────┬─────────────┬─────────────┬──────────────────┤
│   Scaler    │ ScaledObject│  ScaledJob  │  Metrics Server  │
│  (메트릭    │ (Deployment │  (Job 기반  │  (HPA에 메트릭   │
│   수집)     │  스케일링)  │  스케일링)  │   제공)          │
└─────────────┴─────────────┴─────────────┴──────────────────┘
                              ↓
┌─────────────────────────────────────────────────────────────┐
│                    Kubernetes HPA                           │
│              (KEDA가 생성/관리하는 HPA)                      │
└─────────────────────────────────────────────────────────────┘

📋 구성요소 설명

구성요소역할
Scaler외부 시스템(Kafka, Prometheus 등)에서 메트릭 수집
ScaledObjectDeployment/StatefulSet 대상 + 트리거 정의
ScaledJobJob 기반 워크로드 스케일링 (배치 작업용)
Metrics Server수집한 메트릭을 HPA가 이해할 수 있는 형태로 변환

3. 지원 Scaler

🔌 주요 Scaler (60+ 지원)

카테고리Scaler
메시지 큐Kafka, RabbitMQ, AWS SQS, Azure Service Bus, Redis Streams, NATS
데이터베이스PostgreSQL, MySQL, MongoDB, Redis, Cassandra
모니터링Prometheus, Datadog, New Relic, Dynatrace, Graphite
클라우드AWS CloudWatch, GCP Pub/Sub, Azure Monitor, Azure Queue
기타Cron, HTTP Requests, Elasticsearch, etcd, Metrics API

4. 설정 예시

📝 Kafka Consumer 스케일링

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: kafka-consumer-scaler
  namespace: production
spec:
  scaleTargetRef:
    name: kafka-consumer-deployment    # 대상 Deployment
  pollingInterval: 15                  # 메트릭 수집 주기 (초)
  cooldownPeriod: 300                  # 스케일 다운 대기 시간 (초)
  minReplicaCount: 0                   # 이벤트 없으면 0까지 축소
  maxReplicaCount: 100
  triggers:
    - type: kafka
      metadata:
        bootstrapServers: kafka.production:9092
        consumerGroup: order-processor
        topic: orders
        lagThreshold: "50"             # lag 50 이상이면 스케일 아웃

📝 Prometheus 메트릭 기반 스케일링

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: http-scaler
spec:
  scaleTargetRef:
    name: api-deployment
  minReplicaCount: 1
  maxReplicaCount: 20
  triggers:
    - type: prometheus
      metadata:
        serverAddress: http://prometheus.monitoring:9090
        metricName: http_requests_per_second
        query: sum(rate(http_requests_total{app="api"}[2m]))
        threshold: "100"               # 초당 100 요청당 1 Pod

📝 Cron 기반 스케일링 (시간대별)

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: cron-scaler
spec:
  scaleTargetRef:
    name: batch-processor
  minReplicaCount: 0
  maxReplicaCount: 10
  triggers:
    - type: cron
      metadata:
        timezone: Asia/Seoul
        start: 0 9 * * 1-5             # 평일 오전 9시
        end: 0 18 * * 1-5              # 평일 오후 6시
        desiredReplicas: "5"           # 업무 시간에 5개 유지

📝 인증이 필요한 경우 (TriggerAuthentication)

apiVersion: keda.sh/v1alpha1
kind: TriggerAuthentication
metadata:
  name: kafka-auth
spec:
  secretTargetRef:
    - parameter: sasl_username
      name: kafka-secrets
      key: username
    - parameter: sasl_password
      name: kafka-secrets
      key: password
---
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: kafka-scaler-with-auth
spec:
  scaleTargetRef:
    name: kafka-consumer
  triggers:
    - type: kafka
      authenticationRef:
        name: kafka-auth               # 위에서 정의한 인증 참조
      metadata:
        bootstrapServers: kafka:9092
        consumerGroup: my-group
        topic: events

5. 트러블슈팅

🔧 문제 해결

증상원인해결 방법
Pod 스케일 안됨Scaler 연결 실패kubectl describe scaledobject 로 에러 확인
0으로 스케일 다운 안됨minReplicaCount 미설정minReplicaCount: 0 명시
스케일 아웃 느림pollingInterval 너무 김15초 이하로 조정
메트릭 수집 실패인증 문제TriggerAuthentication 리소스 확인
HPA 충돌기존 HPA 존재기존 HPA 삭제 후 KEDA 적용

💻 디버깅 명령어

# ScaledObject 상태 확인
kubectl describe scaledobject <name>
 
# KEDA Operator 로그
kubectl logs -n keda -l app=keda-operator
 
# KEDA가 생성한 HPA 확인
kubectl get hpa
 
# 외부 메트릭 확인
kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1"
 
# ScaledObject 이벤트 확인
kubectl get events --field-selector involvedObject.name=<scaledobject-name>

📚 참고 자료

공식 문서

관련 주제


Ansible EDA와의 차이