KEDA 설치 및 ScaleObject를 통한 설정 배포

개요

GKE내 KEDA(K8s Event-Driven Autoscaler) 배포 및 Prometheus 기반으로 SacleObject를 배포하는 방법을 안내합니다.


이해

  • KEDA (Kubernetes Event-Driven Autoscaler): 이벤트 소스(예: Kafka, Prometheus, RabbitMQ 등)의 메트릭을 기반으로 Kubernetes 워크로드(Deployment, StatefulSet 등)의 Pod 수를 동적으로 조절하는 경량 컴포넌트입니다. KEDA는 이벤트를 감지하여 Horizontal Pod Autoscaler(HPA)를 생성하거나 직접 스케일링합니다.
    • 왜 KEDA를 사용하는가? 기존 HPA는 주로 CPU/메모리 사용량 기반으로 동작하지만, KEDA는 다양한 외부 메트릭 소스와 연동하여 더욱 정교하고 예측 가능한 오토스케일링을 가능하게 합니다. 특히, 이벤트 큐의 길이, 메시지 수, 커스텀 메트릭 등 다양한 지표를 활용할 수 있어 애플리케이션의 실제 부하에 더 민감하게 반응합니다.
  • ScaleObject: KEDA의 커스텀 리소스(CRD)로, 어떤 워크로드를 어떤 기준으로 스케일링할지 정의합니다. scaleTargetRef (대상 워크로드), triggers (스케일링 조건 및 메트릭 소스), minReplicaCount, maxReplicaCount 등의 설정을 포함합니다.

배포(Helm 사용)


## KEDA Helm 저장소 추가
helm repo add kedacore https://kedacore.github.io/charts


## Helm 저장소 정보 업데이트
helm repo update


## KEDA 설치
helm install keda kedacore/keda --namespace keda --create-namespace

ScaleObject 배포

Metric 조건: Prometheus내 kong_http_requests_total 값이 300을 초과할때 점진적 증가

⚠️ threshold 설정 시 매우 중요한 참고 사항:

  • query는 Kong Gateway의 전체 분당 요청 수를 반환합니다.
  • KEDA는 이 query 결과값과 threshold 값을 사용하여 HPA를 설정할 때, 일반적으로 Pod당 평균 목표값으로 해석합니다. 즉, KEDA가 생성하는 HPA는 (sum(rate(kong_http_requests_total{...}[1m]))) / (현재 Pod 수)의 결과가 threshold 값인 300에 도달하도록 Pod 수를 조절하려고 시도합니다.
  • 따라서, threshold: "300"개별 Pod가 분당 약 300개의 요청을 처리하는 것을 목표로 스케일링하겠다는 의미입니다. 실제 운영 환경의 특성과 Kong Gateway의 성능을 고려하여 이 값을 적절히 조정해야 합니다.

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: kong-gw-scaler # ScaledObject 이름
  namespace: kong # 스케일링할 애플리케이션이 배포된 네임스페이스
  labels:
    deploymentName: kong-gw # 스케일링할 Deployment 이름
spec:
  scaleTargetRef:
    name: kong-gw # 스케일링할 Deployment 이름
  pollingInterval: 15
  cooldownPeriod:  300 # 초 단위, 마지막 트리거 후 스케일 다운까지 대기 시간
  minReplicaCount: 3   # 최소 파드 수
  maxReplicaCount: 50  # 최대 파드 수
  triggers:
  - type: prometheus
    metadata:
      serverAddress: http://prometheus.prometheus.svc.cluster.local:9090 #
      metricName: kong_http_requests_total
      query: |
        sum(rate(kong_http_requests_total{container="kong-gw"}[1m]))
      threshold: "300" # 이 값을 초과하면 스케일 아웃, 임계치는 POD당 기준으로 계산 필요, K8s에서 (쿼리 결과)/(POD 수)로 계산하여 적용 인지필요