이번 블로그에서는 KEDA의 개념과 Event Driven AutoScaling을 구현하는 글을 작성해보겠습니다.
KEDA의 개요
Kubernetes 기본 오토스케일링인 HPA(Horizontal Pod Autoscaler)는 CPU/메모리 기반 스케일링에는 최적이지만, 다음과 같은 한계를 가지고 있습니다.
- Scale-to-Zero 적용에 어려움을 겪습니다. 즉 Pod를 0개로 줄일 수 없으며 비용 최적화에 불리합니다.
- 지표가 실제 서비스 부하 원인과 간접적입니다. 즉 HPA는 부하가 생긴 결과로써 대응을 하기 때문에 트래픽 처리에 대한 대응이 늦을 수 있습니다.
- 외부 이벤트 소스(메시지 큐, 스트림 등)를 스케일링 기준으로 삼기 복잡합니다.

그러므로 이런 문제를 해결하기 위해 등장하게 된 것이 바로 KEDA입니다.
KEDA는 Kafka, RabbitMQ, SQS, HTTP 요청 등 여러 이벤트 소스를 직접 스케일링 트리거로 사용할 수 있습니다.
동작 원리
사용자가 KEDA에 관리를 요청하기 위한 ScaledObject자원을 생성하면 admission에 의해서 검수 되고, 유효한 자원일 경우 SclaedObject와 KEDA가 관리하는 HPA 자원이 자동으로 생성됩니다.
여기서 자동으로 생성된 HPA 자원의 지표 참조는 쿠버네티스의 메트릭 서버가 아닌 keda-metrics-apiserver를 참조 하도록 되어 습니다. 즉 KEDA는 애플리케이션 Pod들의 개수를 조절하는 스케일링 작업을 직접 수행하지 않습니다.
- KEDA는 쿠버네티스 Horizontal Pod Autoscaler를 대체할 목적이 아닌 확장/보조를 목표로 개발되었습니다.

구축 방안
먼저 아래의 명령어를 이용해 SQS Queue를 생성해줍니다.
aws sqs create-queue --queue-name order-queue
다음으로 EKS 위에서 KEDA를 구성할 것이기에 아래의 Manifest를 이용해 Cluster를 생성해줍니다.
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: order-cluster
version: "1.31"
region: ap-northeast-2
cloudWatch:
clusterLogging:
enableTypes: ["*"]
iam:
withOIDC: true
serviceAccounts:
- metadata:
name: aws-load-balancer-controller
namespace: kube-system
wellKnownPolicies:
awsLoadBalancerController: true
- metadata:
name: cert-manager
namespace: cert-manager
wellKnownPolicies:
certManager: true
vpc:
subnets:
public:
ap-northeast-2a: { id: public_a }
ap-northeast-2b: { id: public_b }
private:
ap-northeast-2a: { id: private_a }
ap-northeast-2b: { id: private_b }
managedNodeGroups:
- name: order-app-nodegroup
instanceName: order-app-node
instanceType: c5.large
desiredCapacity: 2
minSize: 2
maxSize: 4
privateNetworking: true
아래의 명령어를 이용해 Cluster를 생성해주면 됩니다.
eksctl create cluster -f cluster.yaml
다음으로 아래의 명령어들을 통해 IAM 정책을 생성하고 IRSA를 통해 파드가 생성될 Namespace에 권한을 줍니다.
CLUSTER_NAME=order-cluster
AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
cat << EOF > iam_policy.json
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "GetQueueAttributes",
"Effect": "Allow",
"Action": [
"sqs:GetQueueAttributes",
"sqs:ReceiveMessage",
"sqs:GetQueueUrl",
"sqs:ListQueues",
"sqs:deletemessage"
],
"Resource": "*"
}
]
}
EOF
aws iam create-policy \
--policy-name SqsPolicy \
--policy-document file://iam_policy.json
eksctl create iamserviceaccount \
--cluster=$CLUSTER_NAME \
--namespace=order \
--name=keda-operator \
--role-name=keda-operator-role \
--attach-policy-arn=arn:aws:iam::$AWS_ACCOUNT_ID:policy/SqsPolicy \
--approve
이제 HELM 명령을 통해 KEDA를 설치해줍니다.
helm repo add kedacore https://kedacore.github.io/charts
helm repo update
helm install keda kedacore/keda \
-n order \
--set serviceAccount.operator.create=false \
--set serviceAccount.operator.name=keda-operator
다음으로 아래의 Manifest를 통해 AutoScaling이 이루어질 Deployment를 생성해주겠습니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: order-processor
namespace: order
labels:
app: order-processor
spec:
replicas: 1
selector:
matchLabels:
app: order-processor
template:
metadata:
labels:
app: order-processor
spec:
serviceAccountName: keda-operator
containers:
- name: order-processor
image: <AWS_ACCOUNT_ID>.dkr.ecr.ap-northeast-2.amazonaws.com/order-app:v1
env:
- name: QUEUE_URL
value: "https://sqs.ap-northeast-2.amazonaws.com/<AWS_ACCOUNT_ID>/order-queue"
- name: REGION_NAME
value: ap-northeast-2
ports:
- containerPort: 8080
마지막으로 ScaledObject를 구성해주면 됩니다. 오토스케일링의 기준은 queueLength: "5"로 설정하였기에 SQS 큐에 메시지가 5개 이상일 때 Pod를 추가로 스케일링하게 됩니다.
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: order-processor-scaler
namespace: order
spec:
scaleTargetRef:
name: order-processor
minReplicaCount: 1
maxReplicaCount: 10
pollingInterval: 10
cooldownPeriod: 60
advanced:
horizontalPodAutoscalerConfig:
behavior:
scaleDown:
stabilizationWindowSeconds: 30
policies:
- type: Percent
value: 100
periodSeconds: 15
triggers:
- type: aws-sqs-queue
metadata:
queueURL: https://sqs.ap-northeast-2.amazonaws.com/<AWS_ACCOUNT_ID>/order-queue
activationQueueLength: "0"
queueLength: "5"
awsRegion: ap-northeast-2
identityOwner: operator
이것으로 KEDA의 개념과 Event Driven AutoScaling을 구현하는 글을 마치겠습니다. 감사합니다!
'Cloud > CNCF' 카테고리의 다른 글
| EKS with CrossPlane (0) | 2025.10.01 |
|---|---|
| EKS with Harbor (0) | 2025.09.29 |
| Node Exporter (0) | 2025.06.14 |