쿠버네티스에서는 모든 Pod의 평균 CPU 상태를 파악하고 CPU 사용량이 늘어나면 미리 정의해둔 개수만큼 Pod를 자동으로 확장 시키도록 한다.
HPA는 쿠버네티스의 가장 기본적인 오토스케일링 방식이다. 주로 CPU나 메모리 사용량을 모니터링하다가, 특정 임계치를 넘으면 Pod 수를 늘린다.
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: my-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-app
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 80 # CPU 80% 넘으면 스케일 아웃
위 코드에서 처럼 CPU의 사용률이 80% 가 넘으면 Pod를 maxReplicas 까지 확장을 하고, 다시 줄이들면 자동으로 minReplicas 만큼 축소를 하게된다.
이 외에도 Pod의 리소스를 확장시키는 VPA가 있으며, 이는 Pod의 재시작이 필요하기 때문에 웹 서버에는 부담이 존재한다.
Scale-out > 동일한 스펙의 pod 를 여러개 만들겠다. (수평적 확장) : HPA
Scale-up > pod 자체의 스펙을 높여준다 (수직적 확장) : VPA
HPA 는 기본적으로 CPU/RAM 사용률을 기반으로 Pod의 수를 동적으로 스케일링을 하지만, 동작중인 상태에서 추가적으로 Pod를 늘려서 사용하고 싶다면 결국 수동적인 작업을 하게 된다.
또한 데이터가 직접적으로 유입되는 시점에서 scale out이 발생하게 될 경우 추가 pod의 생성이 완료되는 시점까지의 데이터 처리가 늦어지는 경우도 발생할 수 있다.
KEDA는 “이벤트 기반(Event-Driven)”이라는 특징을 가진 오토스케일러로, 애플리케이션이 직접 부하를 받기 전에 외부 이벤트를 감지하고 선제적으로 스케일링을 수행한다.
HPA의 경우 트래픽이 아예 없을 때도 최소 1개의 Pod는 켜두어야 모니터링이 가능하지만, KEDA는 이벤트가 없을 때 Pod를 아예 0개로 줄였다가, 이벤트가 발생하면 즉시 늘려 클러스터가 야간에 운영될 필요가 없다면,비용 효율을 높일 수 있다.

KEDA의 핵심 구성 요소 KEDA는 크게 3가지 컴포넌트로 동작하여 HPA를 이벤트 기반으로 동작한다.
메시지 큐를 예를 들어 동작 과정을 설명하자면, 이벤트 통신을 통해 메시지가 큐에 들어올 때 KEDA가 큐에 쌓인 메시지 수를 모니터링하다가 기준치를 넘으면 HPA가 target 하고 있는 object를 확장하게 되는 방식이다.
여기서 실질적으로 Deployment의 replicas 조정은 결국 HPA가 처리
KEDA 는 다양한 trigger를 이용하므로 기본적인 HPA 의 기능 뿐만 아니라 Kafka, SQS, Redis Streams, HTTP requests, Prometheus 등 다양한 이벤트 소스 타입을 제공한다. 공식 사이트
설치 방법
# Helm 설치 (이미 설치되어 있다면 생략)
snap install helm --classic
# KEDA Repo 추가 및 업데이트
helm repo add kedacore https://kedacore.github.io/charts
helm repo update
# KEDA 네임스페이스 생성 및 설치
helm install keda kedacore/keda --namespace keda --create-namespace
Keda-rabbitmq-scaler.yml
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: rabbitmq-scaledobject
namespace: default
spec:
scaleTargetRef:
name: reservation-service
minReplicaCount: 1
maxReplicaCount: 10
triggers:
- type: rabbitmq
metadata:
host: "amqp://<user:userpassword@rabbitmq>:5672/"
queueName: reservation.queue
mode: QueueLength
value: "50"
RabbitMQ의 reservation.queue에 쌓인 메시지 수를 모니터링
큐에 메시지가 50개(value) 쌓일 때마다 Pod를 1개씩 추가하여 확장
최소 1개(minReplicaCount)에서 최대 10개(maxReplicaCount)까지 파드 수를 조절