본문 바로가기
Tech/Kubernetes

[AEWS_1기] 5주차 - EKS Autoscaling (2/6) - KEDA

by 구름_쟁이 2023. 5. 22.

 

 

본 시리즈는 가시다님의 AEWS(AWS EKS Workshop) 1기 진행 내용입니다. (가시다님 노션)

스터디에 사용되는 링크 (AWS EKS Workshop) 

 

목차

1. HPA - Horizontal Pod Autoscaler (링크)
2. KEDA - Kubernetes based Event Driven Autoscaler
3. VPA - Vertical Pod Autoscaler
4. CA - Cluster Autoscaler
5. CPA - Cluster Proportional Autoscaler

6. Karpenter : K8S Native AutoScaler & Fargate

 

 

 

EKS 클러스터 세팅 (Cloudformation)

https://s3.ap-northeast-2.amazonaws.com/cloudformation.cloudneta.net/K8S/eks-oneclick4.yaml

 

 

 


1. HPA - Horizontal Pod Autoscaler

KEDA AutoScaler 소개 - Docs DevOcean

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

KEDA Scalers : kafka trigger for an Apache Kafka topic - 링크

triggers:
- type: kafka
  metadata:
    bootstrapServers: kafka.svc:9092 # Comma separated list of Kafka brokers “hostname:port” to connect to for bootstrap.
    consumerGroup: my-group          # Name of the consumer group used for checking the offset on the topic and processing the related lag.
    topic: test-topic                # Name of the topic on which processing the offset lag. (Optional, see note below)
    lagThreshold: '5'                # Average target value to trigger scaling actions. (Default: 5, Optional)
    offsetResetPolicy: latest        # The offset reset policy for the consumer. (Values: latest, earliest, Default: latest, Optional)
    allowIdleConsumers: false        # When set to true, the number of replicas can exceed the number of partitions on a topic, allowing for idle consumers. (Default: false, Optional)
    scaleToZeroOnInvalidOffset: false 
    version: 1.0.0                   # Version of your Kafka brokers. See samara version (Default: 1.0.0, Optional)

 

KEDA with Helm : 특정 이벤트(cron 등)기반의 파드 오토 스케일링 - Chart Grafana Cron

 

이 대시보드를 만드려면

 

# KEDA 설치
cat <<EOT > keda-values.yaml
metricsServer:
  useHostNetwork: true

prometheus:
  metricServer:
    enabled: true
    port: 9022
    portName: metrics
    path: /metrics
    serviceMonitor:
      # Enables ServiceMonitor creation for the Prometheus Operator
      enabled: true
    podMonitor:
      # Enables PodMonitor creation for the Prometheus Operator
      enabled: true
  operator:
    enabled: true
    port: 8080
    serviceMonitor:
      # Enables ServiceMonitor creation for the Prometheus Operator
      enabled: true
    podMonitor:
      # Enables PodMonitor creation for the Prometheus Operator
      enabled: true

  webhooks:
    enabled: true
    port: 8080
    serviceMonitor:
      # Enables ServiceMonitor creation for the Prometheus webhooks
      enabled: true
EOT

kubectl create namespace keda
helm repo add kedacore https://kedacore.github.io/charts
helm install keda kedacore/keda --version 2.10.2 --namespace keda -f keda-values.yaml

# KEDA 설치 확인
kubectl get-all -n keda
kubectl get all -n keda
kubectl get crd | grep keda

# keda 네임스페이스에 디플로이먼트 생성
kubectl apply -f php-apache.yaml -n keda
kubectl get pod -n keda

# ScaledObject 정책 생성 : cron
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

# 그라파나 대시보드 추가
# 모니터링
watch -d 'kubectl get ScaledObject,hpa,pod -n keda'
kubectl get ScaledObject -w

# 확인
kubectl get ScaledObject,hpa,pod -n keda
kubectl get hpa -o jsonpath={.items[0].spec} -n keda | jq
...
"metrics": [
    {
      "external": {
        "metric": {
          "name": "s0-cron-Asia-Seoul-00,15,30,45xxxx-05,20,35,50xxxx",
          "selector": {
            "matchLabels": {
              "scaledobject.keda.sh/name": "php-apache-cron-scaled"
            }
          }
        },
        "target": {
          "averageValue": "1",
          "type": "AverageValue"
        }
      },
      "type": "External"
    }

# KEDA 및 deployment 등 삭제
kubectl delete -f keda-cron.yaml -n keda && kubectl delete deploy php-apache -n keda && helm uninstall keda -n keda
kubectl delete namespace keda

 

중간에 php-apache pod가 0/0 으로 바뀌어서 뭐지 싶었는데 일단 잘 해결되었다!

 

 

배포 직후에는 내 php-apache deploy를 0/0으로 만들어버렸다

 

이후 cron에 지정한 시간이 되면 

47분이 되어 KEDA에 의해 php-apache pod가 하나 늘어났다

 

 

 

그라파나에서 확인해보면 replicas가 증가된 시점도 확인할 수 있다

 

 

# 삭제 타임!
kubectl delete -f keda-cron.yaml -n keda && kubectl delete deploy php-apache -n keda && helm uninstall keda -n keda
kubectl delete namespace keda

 

 

결론

KEDA는 Event-Driven 이기 때문에 이와 관련된 설정에 최적화 되어있다.

관련해서 조사한 내용을 정리하자면

 

이벤트 소스 통합: KEDA는 다양한 이벤트 소스와 통합

  • Kafka, RabbitMQ, Azure Queue, AWS Kinesis 등 다양한 이벤트 메시징 시스템과의 연동을 지원
  • 이벤트 소스에서 발생하는 이벤트를 감지하고 처리할 수 있습니다.

이벤트 트리거: KEDA는 이벤트 소스의 트리거 설정을 통해 어떤 이벤트에 반응하여 애플리케이션을 확장할지 결정

  • 이벤트 소스의 특성과 워크로드 요구에 맞게 구성
  • 예를 들어, 메시지 큐의 메시지 수, 토픽의 파티션 수 등을 이벤트 트리거로 설정

스케일링 및 작업자 파드: KEDA는 이벤트 수신량에 따라 작업자 파드의 수를 동적으로 조절하여 스케일링

  • 이벤트 수신량이 증가하면 KEDA는 더 많은 작업자 파드를 생성하여 이벤트 기반 워크로드를 처리
  • 스케일링을 위해 Kubernetes의 Horizontal Pod Autoscaler (HPA)와 함께 사용 가능

메트릭 수집 및 모니터링: KEDA는 작업자 파드의 메트릭을 수집하고 모니터링

  • 이를 통해 작업자 파드의 상태, 성능 및 이벤트 처리 지표를 추적하고 모니터링 가능

댓글