Kubernetes Event-Drived Autoscaling
개념
KEDA는 다양한 소스로 부터 이벤트를 받아 애플리케이션 파드들을 오토 스케일링 하기 위한 목적으로 개발된 경량의 쿠버네티스 컴포넌트이다.
역할
Agent
이벤트가 유무에 따라 애플리케이션 Deployment를 activate/deactivate시키는 역활 수행하는데,
keda-operator POD에 의해서 수행 된다.
Metrics
다양한 이벤트를 제공하는 메트릭스 서버 역활을 수행한다(like kubernetes metrics server).
제공하는 지표들은 쿠버네티스 Horizontal Pod Autoscaler에 의해서 참조가 되어 진다.
keda-operator-metrics-apiserver POD에 의해서 수행된다.
Admission Webhooks
KEDA관련 자원들의 변경시 Validate를 자동으로 수행하는 역활을 한다(ex: 하나의 Scaled Target에 대해서 복수의 ScaledObject자원 허용 불가 등등..).
keda-admission-webhooks POD에 의해서 수행 된다.
동작 방식 및 특징
사용자가 KEDA에 관리를 요청하기 위한 ScaledObject자원을 생성하면, admission에 의해서 검수 되고,
유효한 자원일 경우 SclaedObject와 KEDA가 관리하는 HPA자원이 자동으로 생성된다.
자동으로 생성된 HPA자원의 지표 참조는 쿠베의 메트릭스 서버가 아닌 keda-metrics-apiserver를 참조 하도록 되어 있다. 즉 KEDA는 애플리케이션 POD들의 개수를 조절하는 스케링 작업을 직접 수행하지 않는다
(KEDA는 쿠버네티스 Horiontal POD Autoscaler를 대체할 목적이 아닌 확장/보조를 목표로 개발되었다)
Scaled Object 주요 설정 값
spec.scaleTargetRef.name
Scaled Object에 의해서 관리되어져야할 POD Deployment자원의 이름
spec.minReplicaCount
최소 POD개수 명세(HPA와는 달리 0을 설정 할수 있다.)
spec.triggers.type
스케일러 타입(위에서 언급한 것처럼 약 60가지의 타입이 지원 된다)
KEDA Install
helm repo add kedacore https://kedacore.github.io/charts
helm repo update
kubectl create namespace keda
helm install keda kedacore/keda --namespace keda
Shell
복사
ScaledObject
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 * * * * # 매 시간 정각 15분, 30분.. 실행
end: 05,20,35,50 * * * * # 매 시간 5분, 20분... 종료
desiredReplicas: "1"
YAML
복사
kubectl apply -f scaledobject.yaml
Shell
복사
Deployment
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
YAML
복사
kubectl apply -f deployment.yaml
Shell
복사
KEDA Check
kubectl get scaledobject
kubectl describe scaledobject
Shell
복사