KEDA - Kubernetes based Event Driven Autoscaler
리소스 메트릭을 기반으로 스케일 여부를 결정했던 HPA와 달링 KEDA는 특정 이벤트를 기반으로 스케일 여부를 결정할 수 있습니다.
예를 들어 airflow는 metadb를 통해 현재 실행중이거나 대기 중인 task가 얼마나 존재하는지 알 수 있습니다.
이러한 이벤트를 활용하여 worker의 scale을 결정한다면 queue에 task가 많이 추가되는 시점에 더 빠르게 확장할 수 있습니다.

Agent
- KEDA는 Kubernetes의 Deployment를 활성화하거나 비홠어화하여 이벤트가 없을 때는 자동으로 스테일을 자동으로 0으로 줄이고 필요할 때 다시 확장합니다.
- 이 동작은 KEDA 설치 시 실행되는 keda-operate를 통해 수행됩니다.
Metric
- KEDA는 Kubernetes 메트릭 서버 역할을 하며 대기열 길이나, 스트림 지연과 같은 다양한 이벤트 데이터를 수집하고 이를 HPA 에 제공하여 자동확장을 유도
- 배포된 어플리케이션은 이벤트를 직접 소비하며, KEDA는 메시지를 완료하거나 포기하는 등의 작업을 기본적으로 지원할 수 있도록 설계되어 있습니다.
- 메트릭 기능은 keda-operator-metrics-apiserver 컨테이너가 수행합니다.
Admission Webhooks
- KEDA는 Admission controller를 활용하여 리소스 변경을 자동으로 검증하고, 오류를 방지
- 동일한 Deploy를 여러 개의 ScaledObject가 동시에 확장하지 못하도록 방지
- keda-admission-webhooks 컨데이터나 수행
KEDA 사용해보기
## KEDA 설치
cat <<EOT > keda-values.yaml
metricsServer:
useHostNetwork: true
prometheus:
metricServer:
enabled: true
path: /metrics
serviceMonitor:
enabled: true
podMonitor:
enabled: true
operator:
enabled: true
port: 8080
serviceMonitor:
enabled: true
podMonitor:
enabled: true
webhooks:
enabled: true
port: 8080
serviceMonitor:
enabled: true
EOT
## helm repo 추가
helm repo add kedacore https://kedacore.github.io/charts
helm repo update
## helm 배포
helm install keda kedacore/keda --version 2.16.0 --namespace keda --create-namespace -f keda-values.yaml
## keda 설치 확인
k get crd | grep keda
k get all -n keda
k get validatingwebhookconfigurations keda-admission -o yaml
k get podmonitor,servicemonitors -n keda
k get apiservice v1beta1.external.metrics.k8s.io -o yaml
## CPU / MEM은 기존 metrics-server에 의존하여, KEDA metrics-server는 외부 이벤트 소스 메트릭을 노출
k get pod -n keda -l app=keda-operator-metrics-apiserver




## 테스트용 Deploy 배포
k apply -f php-apache.yaml -n keda
k get pod -n keda
## scaledObject 정책 생성
cat <<EOT > keda-cron.yaml
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: php-apache-cron-scaled
spec:
minReplicaCount: 0 # 최소 pod 개수, 0개로 완전 중지 가능
maxReplicaCount: 2 # 최대 pod 개수
pollingInterval: 30 # 스케일링 조건 재확인 기간
cooldownPeriod: 300 # 스케일 이벤트 발생 후 추가 축소 방지
scaleTargetRef: # 스케일 타겟 설정
apiVersion: apps/v1
kind: Deployment
name: php-apache
triggers:
- type: cron
metadata:
timezone: Asia/Seoul
start: 00,15,30,45 * * * * # 스케일링 시작
end: 05,20,35,50 * * * * # 스케일링 종료
desiredeplicas: "1"
EOT
k apply -f keda-cron.yaml -n keda
스케줄에 따른 pod 개수 변화
시간 | pod 개수 |
00분 | 1개로 증가 |
05분 | 0개로 감소 |
15분 | 1개로 증가 |
20분 | 0개로 감소 |
30분 | 1개로 증가 |
35분 | 0개로 감소 |
45분 | 1개로 증가 |
50분 | 0개로 감소 |
start에서 지정된 시간에 pod를 최소 1개로 유지하고, end에 맞춰 다시 pod를 0개로 축소합니다.
Grafana Dashboard 추가
## KEDA 대시보드 Import : https://github.com/kedacore/keda/blob/main/config/grafana/keda-dashboard.json
## 모니터링
watch -d 'kubectl get ScaledObject,hpa,pod -n keda'
k get ScaledObject -w
## 확인
k get ScaledObject,hpa,pod -n keda
k get hpa -o jsonpath="{.items[0].spec}" -n keda | jq



'Cloud > AWS' 카테고리의 다른 글
[AWS] EKS Autoscaler - CAS (0) | 2025.03.09 |
---|---|
[AWS] EKS Autoscaling - VPA (0) | 2025.03.08 |
[AWS] EKS AutoScaling - HPA (0) | 2025.03.08 |
[AWS] EKS Observability (1) | 2025.03.02 |
[AWS] EKS Storage (0) | 2025.02.23 |
KEDA - Kubernetes based Event Driven Autoscaler
리소스 메트릭을 기반으로 스케일 여부를 결정했던 HPA와 달링 KEDA는 특정 이벤트를 기반으로 스케일 여부를 결정할 수 있습니다.
예를 들어 airflow는 metadb를 통해 현재 실행중이거나 대기 중인 task가 얼마나 존재하는지 알 수 있습니다.
이러한 이벤트를 활용하여 worker의 scale을 결정한다면 queue에 task가 많이 추가되는 시점에 더 빠르게 확장할 수 있습니다.

Agent
- KEDA는 Kubernetes의 Deployment를 활성화하거나 비홠어화하여 이벤트가 없을 때는 자동으로 스테일을 자동으로 0으로 줄이고 필요할 때 다시 확장합니다.
- 이 동작은 KEDA 설치 시 실행되는 keda-operate를 통해 수행됩니다.
Metric
- KEDA는 Kubernetes 메트릭 서버 역할을 하며 대기열 길이나, 스트림 지연과 같은 다양한 이벤트 데이터를 수집하고 이를 HPA 에 제공하여 자동확장을 유도
- 배포된 어플리케이션은 이벤트를 직접 소비하며, KEDA는 메시지를 완료하거나 포기하는 등의 작업을 기본적으로 지원할 수 있도록 설계되어 있습니다.
- 메트릭 기능은 keda-operator-metrics-apiserver 컨테이너가 수행합니다.
Admission Webhooks
- KEDA는 Admission controller를 활용하여 리소스 변경을 자동으로 검증하고, 오류를 방지
- 동일한 Deploy를 여러 개의 ScaledObject가 동시에 확장하지 못하도록 방지
- keda-admission-webhooks 컨데이터나 수행
KEDA 사용해보기
## KEDA 설치
cat <<EOT > keda-values.yaml
metricsServer:
useHostNetwork: true
prometheus:
metricServer:
enabled: true
path: /metrics
serviceMonitor:
enabled: true
podMonitor:
enabled: true
operator:
enabled: true
port: 8080
serviceMonitor:
enabled: true
podMonitor:
enabled: true
webhooks:
enabled: true
port: 8080
serviceMonitor:
enabled: true
EOT
## helm repo 추가
helm repo add kedacore https://kedacore.github.io/charts
helm repo update
## helm 배포
helm install keda kedacore/keda --version 2.16.0 --namespace keda --create-namespace -f keda-values.yaml
## keda 설치 확인
k get crd | grep keda
k get all -n keda
k get validatingwebhookconfigurations keda-admission -o yaml
k get podmonitor,servicemonitors -n keda
k get apiservice v1beta1.external.metrics.k8s.io -o yaml
## CPU / MEM은 기존 metrics-server에 의존하여, KEDA metrics-server는 외부 이벤트 소스 메트릭을 노출
k get pod -n keda -l app=keda-operator-metrics-apiserver




## 테스트용 Deploy 배포
k apply -f php-apache.yaml -n keda
k get pod -n keda
## scaledObject 정책 생성
cat <<EOT > keda-cron.yaml
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: php-apache-cron-scaled
spec:
minReplicaCount: 0 # 최소 pod 개수, 0개로 완전 중지 가능
maxReplicaCount: 2 # 최대 pod 개수
pollingInterval: 30 # 스케일링 조건 재확인 기간
cooldownPeriod: 300 # 스케일 이벤트 발생 후 추가 축소 방지
scaleTargetRef: # 스케일 타겟 설정
apiVersion: apps/v1
kind: Deployment
name: php-apache
triggers:
- type: cron
metadata:
timezone: Asia/Seoul
start: 00,15,30,45 * * * * # 스케일링 시작
end: 05,20,35,50 * * * * # 스케일링 종료
desiredeplicas: "1"
EOT
k apply -f keda-cron.yaml -n keda
스케줄에 따른 pod 개수 변화
시간 | pod 개수 |
00분 | 1개로 증가 |
05분 | 0개로 감소 |
15분 | 1개로 증가 |
20분 | 0개로 감소 |
30분 | 1개로 증가 |
35분 | 0개로 감소 |
45분 | 1개로 증가 |
50분 | 0개로 감소 |
start에서 지정된 시간에 pod를 최소 1개로 유지하고, end에 맞춰 다시 pod를 0개로 축소합니다.
Grafana Dashboard 추가
## KEDA 대시보드 Import : https://github.com/kedacore/keda/blob/main/config/grafana/keda-dashboard.json
## 모니터링
watch -d 'kubectl get ScaledObject,hpa,pod -n keda'
k get ScaledObject -w
## 확인
k get ScaledObject,hpa,pod -n keda
k get hpa -o jsonpath="{.items[0].spec}" -n keda | jq



'Cloud > AWS' 카테고리의 다른 글
[AWS] EKS Autoscaler - CAS (0) | 2025.03.09 |
---|---|
[AWS] EKS Autoscaling - VPA (0) | 2025.03.08 |
[AWS] EKS AutoScaling - HPA (0) | 2025.03.08 |
[AWS] EKS Observability (1) | 2025.03.02 |
[AWS] EKS Storage (0) | 2025.02.23 |