KEDA: Kubernetes Event-Driven Autoscaling 소개
클라우드 네이티브 애플리케이션은 동적으로 변하는 트래픽과 워크로드를 효율적으로 처리하기 위해 자동 확장이 필수적입니다. Kubernetes는 기본적인 자동 확장 기능을 제공하지만, KEDA(Kubernetes Event-Driven Autoscaling)는 보다 세밀하고 이벤트 기반의 자동 확장을 가능하게 해줍니다. 이번 포스팅에서는 KEDA의 개념, 주요 기능, 그리고 사용 사례에 대해 알아보겠습니다.
KEDA란 무엇인가?
KEDA(Kubernetes Event-Driven Autoscaling)는 Kubernetes와 함께 작동하도록 설계된 이벤트 기반 자동 확장 플랫폼입니다. KEDA는 Kubernetes 클러스터에서 애플리케이션을 안정적이고 확장 가능하게 실행할 수 있도록 지원합니다. KEDA는 애플리케이션의 이벤트 소스를 모니터링하고, 이벤트 볼륨에 따라 워크로드를 자동으로 확장하거나 축소합니다. 이를 통해 리소스 사용을 최적화하고 비용을 절감하며, 애플리케이션이 빠르게 반응하고 확장할 수 있도록 합니다.
KEDA는 Kafka, Datadog, Prometheus, Cron 등 다양한 이벤트 소스를 지원합니다. 또한 이벤트 수, 이벤트 페이로드 크기 등에 따라 확장하는 다양한 전략을 제공합니다.
KEDA vs HPA (HorizontalPodAutoscaler)
HPA (HorizontalPodAutoscaler)는 Kubernetes 클러스터에서 실행 중인 애플리케이션의 리소스 사용량(CPU, 메모리 사용량)을 기반으로 POD를 확장하거나 축소합니다. 반면, KEDA (Kubernetes Event-Driven Autoscaling)는 이벤트 기반으로 Kubernetes 클러스터에서 실행 중인 애플리케이션의 POD를 확장하거나 축소합니다. KEDA는 다양한 이벤트 소스(예: 메시지 큐, 데이터베이스, HTTP 요청, Cron, 특정 시점의 메트릭 등)를 트리거로 사용하여 POD를 확장하거나 축소할 수 있습니다.
Getting Started with KEDA
Install
KEDA를 Kubernetes 클러스터에 Helm을 사용하여 설치합니다.
$ helm repo add kedacore https://kedacore.github.io/charts
$ helm repo update
$ helm install keda kedacore/keda --namespace keda --create-namespace
Deployment 생성
예시를 위해 nginx deployment를 생성합니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
ScaledObject 생성
ScaledObject를 사용하여 특정 시간과 CPU 사용률을 기준으로 자동 확장을 설정합니다. CPU / Memory 사용률 기준 트리거를 설정하면 KEDA가 HPA (HorizontalPodAutoscaler)를 생성합니다. ScaledObject를 적용하면 오전 9시부터 10시까지 nginx-deployment
의 replica 사이즈가 8개로 확장되는걸 확인할 수 있습니다.
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: nginx-scaledobject
spec:
maxReplicaCount: 10
minReplicaCount: 3
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx-deployment
triggers:
- metadata:
value: "50"
metricType: Utilization
type: cpu
- metadata:
desiredReplicas: "8"
end: 00 09 * * *
start: 00 10 * * *
timezone: Asia/Seoul
type: cron