KEDA 오토 스케일러를 사용해 카펜터 스케일링을 해보자~
기존의 HPA(Horizontal Pod Autoscaler)는 리소스(CPU, Memory) 메트릭을 기반으로 스케일 여부를 결정하게 됩니다.
반면에 KEDA는 특정 이벤트를 기반으로 스케일 여부를 결정할 수 있습니다.
예) Producer 와 Consumer 간 메시지 처리 지연 LAG 발생 시 - 링크
KEDA Scalers : kafka trigger for an Apache Kafkatopic - Link
Producer 와 Consumer 간 메시지 처리 지연 LAG 발생 시 - 링크
스케일 대응이 없을 시 : producer 의 traffic rate 를 consumer 이 처리 하지 못해서 문제 발생
KEDA 를 통한 스케일 관리 대응 시, producer 의 traffic rate 가 기준 이상 시 consumer instances 를 자동으로 증가해서 처리할 수 있게 해줌
KEDA with Helm :
특정 이벤트(카프카의 특정 토픽의 LAG Threshold 가 '1' 이상 일 때) 기반의 파드오토 스케일링 - Chart참고링크
1
kubectl create namespace keda
helm repo add kedacore https://kedacore.github.io/charts
helm install keda kedacore/keda --version 2.12.0 --namespace keda
# KEDA 설치 확인
kubectl get all -n keda
kubectl get-all -n keda
kubectl get crd | grep keda
2
# Deploy Consumer application : 컨슈머로 인해 토픽도 생성됨
curl -s -O https://raw.githubusercontent.com/gasida/DOIK/main/3/keda-deploy-svc.yaml
cat keda-deploy-svc.yaml | yh
kubectl apply -f keda-deploy-svc.yaml
kubectl get pod -n keda -l app=consumer-service
# 확인
kubectl get kafkatopics -n kafka
kubectl exec -it ds/myclient -- kafka-topics.sh --bootstrap-server $SVCDNS --topic my-topic --describe
kubectl exec -it ds/myclient -- kafka-consumer-groups.sh --bootstrap-server $SVCDNS --group keda-consumer --describe
kubectl logs -n keda -l app=consumer-service -f
# kube-ops-view 로 증가/감소 확인
# KEDA 스케일 관련 정책 생성 : LAG 1 기준 달성 시 파드 증가, producer traffic rate 가 기준 이상이 되면 consumer instances 증가
3
# 컨슈머 LAG (지연) = ‘프로듀서가 보낸 메시지 갯수(카프카에 남아 있는 메시지 갯수)’ - 컨슈머가 가져간 메시지 갯수’
curl -s -O https://raw.githubusercontent.com/gasida/DOIK/main/3/keda-scale.yaml
cat keda-scale.yaml | yh
kubectl apply -f keda-scale.yaml
4
# 모니터링
watch 'kubectl get ScaledObject,hpa,pod -n keda'
kubectl get ScaledObject,hpa -n keda
kubectl logs -n keda -l app=consumer-service
컴슈머가 증가되더록 부하를 준다.
5
# (터미널1) for문 반복 메시지 보내기
for ((i=1; i<=100; i++)); do echo "keda-scale-test-$i" ; kubectl exec -it ds/myclient -- sh -c "echo test1-$i | kafka-console-producer.sh --bootstrap-server $SVCDNS --topic my-topic" ; date ; done
# 모니터링 : 증가한 consumer 파드 확인
kubectl get pod -n keda -l app=consumer-service
# 메시지 보내기 취소 후 일정 시간이 지나면 자동으로 consumer 파드가 최소 갯수 1개로 줄어든다
6
(옵션) KEDA 및 deployment 등 삭제
kubectl delete ScaledObject -n keda consumer-scaler
kubectl delete deploy -n keda consumer
kubectl delete svc -n keda consumer-service
kubectl delete kafkatopics -n kafka my-topic
helm uninstall keda -n keda
kubectl delete namespace keda
7
(실습 완료 후) 자원 삭제
Kafka 클러스터 삭제
kubectl delete -f kafka-1.yaml -n kafka
혹은
kubectl delete -f kafka-2.yaml -n kafka
삭제 방안 : 장점(1줄 명령어로 완전 삭제), 단점(삭제 실행과 완료까지 SSH 세션 유지 필요)
eksctl delete cluster --name $CLUSTER_NAME && aws cloudformation delete-stack --stack-name $CLUSTER_NAME
https://brunch.co.kr/@topasvga/3537
https://brunch.co.kr/@topasvga/3511
위 내용은 주말 CloudNet 스터디 내용 참고하여 정리한 부분입니다.
https://gasidaseo.notion.site/gasidaseo/CloudNet-Blog-c9dfa44a27ff431dafdd2edacc8a1863