본 시리즈는 가시다님의 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
이 대시보드를 만드려면
https://github.com/kedacore/keda/blob/main/config/grafana/keda-dashboard.json
위 주소로 가서 나오는 코드를 복사
그라파나 대시보드 import 에서 json칸에 붙여넣기
# 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가 하나 늘어났다
# 삭제 타임!
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는 작업자 파드의 메트릭을 수집하고 모니터링
- 이를 통해 작업자 파드의 상태, 성능 및 이벤트 처리 지표를 추적하고 모니터링 가능
'Tech > Kubernetes' 카테고리의 다른 글
[AEWS_1기] 6주차 - EKS Security (1/3) - K8S 인증/인가 (0) | 2023.05.31 |
---|---|
[AEWS_1기] 5주차 - EKS Autoscaling (3/6) - VPA (0) | 2023.05.22 |
[AEWS_1기] 5주차 - EKS Autoscaling (1/6) - HPA (0) | 2023.05.22 |
[AEWS_1기] 4주차 - Observability (6/6) - kubecost (0) | 2023.05.19 |
[AEWS_1기] 4주차 - Observability (5/6) - 그라파나 Grafana (0) | 2023.05.19 |
댓글