본문 바로가기
Tech/Kubernetes

[AEWS_1기] 5주차 - EKS Autoscaling (1/6) - HPA

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

Kubernetes autoscaling overview - CON324_Optimizing-Amazon-EKS-for-performance-and-cost-on-AWS.pdf 발췌

HPA - Scale Out

VPA - Scale Up

Karpenter - EKS의 자원 상태를 직접 확인하고, 원하는 SKU의 Node 중 시스템적으로 계산해서 자동 증설

 

AutoScaler

 

Workload Autoscaling - Horizontal Pod Autoscaler

 

 

HPA 아키텍처 : cAdvisor 이 컨테이너의 메모리/CPU 수집 → metrics-server 는 kubelet 를 통해서 수집 후 apiserver 에 등록 → HPA는 apiserver(Resource API)를 통해서 15분 마다 메모리/CPU 수집하여 정책에 따라 동작

 

  • metrics.type(Resource, Pods, Object), target.type(Utilization, AverageValue, Value)

실습 : kube-ops-view 와 그라파나(17125)에서 모니터링 같이 해보자 - 링크 Docs k8s

## php-apache.yaml
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

 

# Run and expose php-apache server
curl -s -O https://raw.githubusercontent.com/kubernetes/website/main/content/en/examples/application/php-apache.yaml
cat php-apache.yaml | yh
kubectl apply -f php-apache.yaml

# 확인
kubectl exec -it deploy/php-apache -- cat /var/www/html/index.php
...

# 모니터링 : 터미널2개 사용
watch -d 'kubectl get hpa,pod;echo;kubectl top pod;echo;kubectl top node'
kubectl exec -it deploy/php-apache -- top

# 접속
PODIP=$(kubectl get pod -l run=php-apache -o jsonpath={.items[0].status.podIP})
curl -s $PODIP; echo

 

그라파나를 미리 준비해두어야 함(17125 추가)

php-apache deployment 배포 후 curl 명령을 while로 날려보자

 

Target이 35%/50%으로 올라가고 있음이 보인다.

 

그라파나 화면

 

이번에는 다른 pod가 알아서 php-ahache service를 괴롭히게 해보자

 

6개까지 잘 증가되었다!

 

이제 부하를 끊고, Scale In되기를 기다려보자

 

 

pod 생성 대략 5분이 지난 시점에 아래처럼 Scale In

 

고생했던 php-apache pod가 1개로 줄어들었다

 

# 그럼 이제 사라져 줘야겠다
kubectl delete deploy,svc,hpa,pod --all

 

 

 

 

결론

쿠버네티스를 공부하며 한번쯤은 해봤던 HPA였는데, 그라파나까지 연동해서 보니 그럴듯해졌다 (짝짝짝짝)

HPA를 정리해보자면,

 

리소스 사용률 기반 스케일링: 애플리케이션의 리소스 사용률(CPU, 메모리 등)을 모니터링하고 이에 따라 Pod의 수 조절

  • 리소스 사용률을 기준으로 스케일링할 수 있어 애플리케이션의 부하에 따라 자동으로 확장하거나 축소

메트릭 수집 및 모니터링: HPA는 지정된 리소스에 대한 메트릭을 주기적으로 수집하고 모니터링

  • CPU 사용률, 메모리 사용률 등의 메트릭을 수집하여 애플리케이션의 상태를 파악하고 스케일링 결정에 활용

스케일링 알고리즘: HPA는 설정된 스케일링 알고리즘에 따라 Pod의 수를 조절

  • Kubernetes에서 기본적으로 사용되는 스케일링 알고리즘은 리소스 사용률의 증감에 따라 Pod의 수를 조절하는 리소스 사용률 기반 알고리즘
  • 사용자 정의 메트릭을 활용하여 스케일링 알고리즘을 사용자 정의 가능

HorizontalPodAutoscaler 리소스: HPA는 Kubernetes의 HorizontalPodAutoscaler 리소스를 사용하여 구성

  • HPA는 특정 Deployment, ReplicaSet 또는 StatefulSet과 연결되어 해당 애플리케이션에 대한 자동 스케일링을 정의

최소 및 최대 Pod 수 제한: HPA는 설정된 최소 및 최대 Pod 수 제한에 따라 스케일링 작업을 수행

  • 최소 Pod 수는 애플리케이션의 최소 가용성을 보장하며, 최대 Pod 수는 자원 소비를 제한하여 클러스터의 안정성을 유지

댓글