개요
Kubernetes의 기본 오토스케일러인 HPA는 CPU와 메모리 사용률을 기반으로 동작합니다. 하지만 실제 워크로드는 CPU가 아닌 이벤트에 반응해야 하는 경우가 많습니다.
- Kafka topic에 메시지가 쌓이면 consumer를 늘려야 한다
- 새벽에는 트래픽이 없으니 Pod를 완전히 내리고 싶다
- 업무 시간에는 최소 N개를 항상 유지해야 한다
HPA만으로는 이런 요구사항을 충족하기 어렵습니다. KEDA는 이 간극을 메우기 위해 만들어진 도구입니다.
KEDA가 필요한 대표적인 상황:
| 상황 | HPA | KEDA |
|---|---|---|
| Kafka consumer lag 기반 스케일링 | 불가 | 가능 |
| 이벤트 없을 때 Pod 0으로 축소 | 불가 (최소 1) | 가능 |
| 시간대별 스케줄 스케일링 | 불가 | 가능 |
| Redis/RabbitMQ 큐 길이 기반 스케일링 | 불가 | 가능 |
| CPU/Memory 기반 스케일링 | 가능 | 가능 (KEDA가 HPA를 내부 활용) |
KEDA는 HPA를 대체하는 것이 아니라, HPA가 다루지 못하는 외부 메트릭을 HPA에 연결해주는 어댑터 역할을 합니다. 기존 HPA 위에 얹히는 구조라 기존 Kubernetes 워크플로우와 충돌하지 않습니다.
KEDA란?
KEDA(Kubernetes Event-Driven Autoscaling)는 Kubernetes에서 이벤트 소스(Kafka lag, HTTP 요청 수, Redis 큐 길이 등)를 기반으로 워크로드를 자동 확장/축소하는 오픈소스 컴포넌트입니다.
기본 HPA(Horizontal Pod Autoscaler)는 CPU/Memory 메트릭만 지원하지만, KEDA는 외부 이벤트 소스에 연결된 30+ Scaler를 제공합니다.
KEDA가 해결하는 문제
HPA와 가장 큰 차이점은 Pod를 0으로 축소(scale-to-zero) 할 수 있다는 점입니다. 이벤트가 없을 때 Pod를 완전히 제거하고, 이벤트 발생 시 다시 시작합니다.
아키텍처
KEDA는 내부적으로 HPA를 생성하고 관리합니다. 직접 HPA를 조작하지 않아도 됩니다.
핵심 CRD
| CRD | 용도 |
|---|---|
ScaledObject |
Deployment, StatefulSet 등 상시 실행 워크로드 스케일링 |
ScaledJob |
Job 단위로 실행되는 배치 워크로드 스케일링 |
TriggerAuthentication |
Scaler 인증 정보(시크릿 참조) 분리 관리 |
Pod Scale-out 과정
KEDA가 외부 이벤트를 감지한 뒤 실제로 Pod가 늘어나기까지 두 레이어를 거칩니다.
Layer 1 - KEDA 컴포넌트 간 흐름
각 컴포넌트의 역할:
- Scaler: 외부 이벤트 소스에 직접 연결해 메트릭을 가져오는 플러그인. Kafka면 consumer lag, Redis면 list length를 조회
- Metrics Server: Scaler가 가져온 값을 Kubernetes Custom Metrics API 형태로 노출. HPA가 이 API를 통해 외부 메트릭을 읽음
- KEDA Operator: ScaledObject를 감시하고 대응하는 HPA를 생성/삭제/업데이트. scale-to-zero도 이 Operator가 직접 처리 (HPA는 0 replica를 지원하지 않으므로)
- HPA: 실제 Deployment의 replica 수를 조절하는 Kubernetes 기본 컨트롤러
Layer 2 - Kubernetes 내부 메커니즘
HPA가 scale 결정을 내린 뒤 실제 Pod가 생성되기까지의 흐름입니다.
각 단계 설명:
- HPA → kube-apiserver: HPA controller가 계산한 replica 수로 Deployment를 업데이트
- ReplicaSet 생성: Deployment controller가 차이만큼 새 Pod 스펙을 가진 ReplicaSet 생성
- kube-scheduler: Pending 상태 Pod를 감지하고 Node의 가용 리소스, nodeSelector, affinity, taint/toleration을 검토해 배치할 Node 결정
- kubelet: 배정된 Node의 kubelet이 컨테이너 이미지를 pull하고 컨테이너 실행
- readinessProbe: readinessProbe를 통과해야 Service 엔드포인트에 등록되어 트래픽을 받기 시작
Scale-to-zero 특수 처리
HPA는 replica를 0으로 설정할 수 없습니다. KEDA Operator가 이를 직접 처리합니다.
- scale-to-zero: KEDA Operator가 Deployment를 직접 0으로 패치
- scale-from-zero: 새 이벤트 감지 시 Operator가 1로 복구한 뒤 HPA가 이후 스케일링을 이어받음
설치
helm repo add kedacore https://kedacore.github.io/charts
helm repo update
helm install keda kedacore/keda \
--namespace keda \
--create-namespace설치 확인:
kubectl get pods -n keda
# NAME READY STATUS
# keda-operator-xxx 1/1 Running
# keda-operator-metrics-apiserver-xxx 1/1 Running