개요
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 수)로 계산하여 적용 인지필요