CloudNet@ 팀의 가시다님께서 Leading 하시는 AEWS Study 5주차 스터디 내용 정리
이번 포스팅에서는 EKS AutoScaling 중 Event 기반의 HPA 를 가능하게 해주는 KEDA 에 대해 알아보겠습니다.
1. KEDA
Kubernetes based Event Driven Autoscaler 의 약자로 k8s 환경에서 특정 이벤트를 기반으로 스케일 여부를 결정할 수 있게 해주는 도구입니다.
기존 HPA 의 기능인 메트릭 기반의 스케일링을 확장시켜 보다 유연한 Pod Scaling 이 가능합니다.
KEDA 에 사용할 수 있는 Event 로는 다음 공식 문서에 나와있습니다.
1.1. KEDA 개요
KEDA 3가지 핵심 컴포넌트
a. Agent
- Kubernetes Deployment의 Scale 을 확장하고 축소하는 핵심 역할
- KEDA 설치 시 'keda-operator' 라는 이름으로 표현
b. Metrics
- HPA 를 실행시키기 위한 Metrics 수집 서버
- KEDA 설치 시 'keda-operator-metrics-apiserver' 이름으로 표현
c. Admission Webhooks
- HPA 실행 시, 잘못된 구성으로 인한 스케일링을 방지하기 위한 유효성 검사 처리.
- KEDA 설치 시 'admission controller' 이름으로 표현
KEDA CRD
KEDA 설치 시 다음과 같은 CRD 가 생성됩니다.
a. ScaledObjects
- Event Source 와 k8s Object (Deployment, StatefulSet 등) 을 매핑시켜주는 리소스
b. ScaledJobs
- Event Source 와 k8s Job 을 매핑시켜주는 리소스
c. TriggerAuthentication / ClusterTriggerAuthentication
- ScaledObjects와 ScaledJobs이 스케일링을 위해 참조하는 Event Source 에 대한 Secret 구성이나 인증에 대한 권한을 나타내는 리소스
1.2. KEDA 설치
Helm 설치가 가능하기 때문에 Helm 으로 설치했습니다.
helm repo add kedacore https://kedacore.github.io/charts
helm repo update
kubectl create namespace keda
helm install keda kedacore/keda --namespace keda --version 2.10.2
1.3. 테스트 앱 배포
apiVersion: apps/v1
kind: Deployment
metadata:
name: php-apache
spec:
selector:
matchLabels:
run: php-apache
template:
metadata:
labels:
run: php-apache
spec:
containers:
- name: php-apache
image: registry.k8s.io/hpa-example
ports:
- containerPort: 80
resources:
limits:
cpu: 500m
requests:
cpu: 200m
---
apiVersion: v1
kind: Service
metadata:
name: php-apache
labels:
run: php-apache
spec:
ports:
- port: 80
selector:
run: php-apache
1.4. KEDA 정책 생성
- 생성한 php-apache Deployment 대해 Cron Job 형태의 이벤트 기반 Scaling 정책 생성
cat <<EOT > keda-cron.yaml
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: php-apache-cron-scaled
spec:
minReplicaCount: 0
maxReplicaCount: 2
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 * * * *
desiredReplicas: "1"
EOT
kubectl apply -f keda-cron.yaml -n keda
이후 특정 시간에 맞춰 Pod Scaling 이 되는 것을 확인할 수 있습니다.
참고 문서
https://devocean.sk.com/blog/techBoardDetail.do?ID=164800
https://keda.sh/