KEDA 실습
KEDA의 동작 원리
KEDA(Kubernetes Event-Driven Autoscaling)는 이벤트 기반 오토스케일러(Event-Driven Autoscaler) 로 쿠버네티스에서 애플리케이션의 부하(Workload)를 실시간으로 감지하고 동적으로 파드 개수를 조정하는 기능을 제공한다.
일반적인 HPA(Horizontal Pod Autoscaler)가 CPU 및 메모리 사용률 기반으로 스케일링하는 반면, KEDA는 Kafka, RabbitMQ, AWS SQS, Prometheus, HTTP 요청량 등 다양한 외부 이벤트를 기반으로 오토스케일링을 수행할 수 있다.
Scaler
- 다양한 외부 시스템(Kafka, Redis, AWS SQS 등)의 이벤트를 감지하는 역할을 한다.
- 특정 조건을 충족하면 쿠버네티스 HPA를 통해 파드를 스케일링하도록 요청한다.
KEDA 오퍼레이터
- 쿠버네티스 클러스터에서 KEDA의 전체적인 동작을 관리하는 컨트롤러이다.
- Scaler를 통해 감지된 이벤트를 기반으로 HPA를 생성하거나 삭제하고 파드를 자동으로 스케일링한다.

CAS 실습
CAS 동작 원리
Cluster Autoscaler의 줄임말인 CAS는 클러스터에서 자동으로 노드를 확장(Scale-Out)하거나 축소(Scale-In)하는 기능을 제공하는 오토스케일러로 클러스터 내의 파드 증가/감소에 따라 클러스터 노드 개수를 자동으로 조정한다.
Cluster Autoscaler는 크게 3가지 주요 컴포넌트로 구성된다.
- Cluster Autoscaler 컨트롤러
- 쿠버네티스 클러스터 내부에서 실행되는 컨트롤러로, 지속적으로 클러스터 상태를 모니터링한다.
- 파드가 Pending 상태인지 감지하고 필요에 따라 노드를 추가하거나 제거한다.
Cloud Provider 연동
- CAS는 AWS의 Auto Scaling Group(ASG), GKE의 Node Pool, Azure의 VMSS와 같은 클라우드 프로바이더의 스케일링 기능과 직접 연동된다.
이를 통해 CAS가 클러스터의 노드 개수를 동적으로 변경할 수 있다.
- CAS는 쿠버네티스의 기본 스케줄러와 연동되어 새로운 노드가 필요한지 여부를 결정한다.
클러스터 내 Nginx Pod를 배포하여 클러스터 내에 사용 가능한 노드가 부족한 상황을 만들었을 때 오토스케일링 되는 동작을 확인한다.
aws autoscaling describe-auto-scaling-groups \
> --query "AutoScalingGroups[? Tags[? (Key=='eks:cluster-name') && Value=='myeks']].[AutoScalingGroupName, MinSize, MaxSize,DesiredCapacity]" \
> --output table
-----------------------------------------------------------------
| DescribeAutoScalingGroups |
+------------------------------------------------+----+----+----+
| eks-ng1-fecab7e6-19c7-eab3-e78a-3055343e283c | 3 | 3 | 3 |
+------------------------------------------------+----+----+----+
현재 노드 그룹은 최소 3개, 최대 3개의 EC2 인스턴스를 유지하도록 설정돼있다.
export ASG_NAME=$(aws autoscaling describe-auto-scaling-groups --query "AutoScalingGroups[? Tags[? (Key=='eks:cluster-name') && Value=='myeks']].AutoScalingGroupName" --output text)
aws autoscaling update-auto-scaling-group --auto-scaling-group-name ${ASG_NAME} --min-size 3 --desired-capacity 3 --max-size 6
aws autoscaling describe-auto-scaling-groups --query "AutoScalingGroups[? Tags[? (Key=='eks:cluster-name') && Value=='myeks']].[AutoScalingGroupName, MinSize, MaxSize,DesiredCapacity]" --output table
-----------------------------------------------------------------
| DescribeAutoScalingGroups |
+------------------------------------------------+----+----+----+
| eks-ng1-fecab7e6-19c7-eab3-e78a-30552341e283c | 3 | 6 | 3 |
+------------------------------------------------+----+----+----+
MaxSize를 6으로 변경하여 최대 6개까지 증가할 수 있도록 확장한다.
kubectl apply -f nginx.yaml
deployment.apps/nginx-to-scaleout created
kubectl get deployment/nginx-to-scaleout
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-to-scaleout 0/1 1 0 3s
kubectl scale --replicas=15 deployment/nginx-to-scaleout && date
deployment.apps/nginx-to-scaleout scaled
Fri Mar 7 21:41:32 KST 2025


EKS 클러스터에서 노드가 부족하면 Cluster AutoScaler가 오토스케일링 기능으로 EC2 Fleet을 사용하여 추가 워커 노드를 자동으로 증설한 것을 확인할 수 있는데,
AWS CloudTrail > 이벤트 기록 > CreateFleet 확인 가능하다.

노드가 완전히 줄어드는데까지 시간이 조금 걸린다. 원래 3대로 정상적으로 감소한 것을 확인할 수 있다.