Search

KEDA

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
복사