본문 바로가기

⭐ Kubernetes & EKS/EKS

Horizontal Pod Autoscaler를 이용한 파드 오토스케일링

# 쿠버네티스 에서는 두가지의 오토스케일링 정책을 제공한다.

1. Cluster Autoscaler : AWS EC2의 오토스케일링과 같이 EC2 인스턴스 자체를 스케일 아웃 하여 신규로 생성하는 것을 말한다.
2. Horizontal Pod Autoscaler : HPA : pod에 스케일 아웃 옵션을 주어 해당 리소스가 임계값을 초과해서 사용할 경우 pod를 증가시키는 방법이다.

# 여기서 Cluster Autoscaler는 생략하고, HPA에 대해서 설명하도록 하겠다.

1. 메트릭 서버배포

- pod의 자원 현황을 실시간으로 확인해야 하므로 지표값을 수집하는 역할을 하는 메트릭 서버를 배포한다.
- 배포하는 방법은 다양하다.

pod와 node들의 자원을 모니터링 하는 방법에 대해서 알아보자.

- 명령어를 실행하여 yaml 파일을 설치하자.

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.7/components.yaml

- 정상적으로 설치 후 아래의 명령어를 입력하면 아래와 같이 리소스 사용량을 실시간으로 확인 할 수 있다.

seungkim:~/environment $ kubectl top nodes
NAME                                                CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
ip-192-168-57-22.ap-northeast-2.compute.internal    60m          3%     1512Mi          21%       
ip-192-168-87-102.ap-northeast-2.compute.internal   98m          5%     966Mi           13%

- 배포된 메트릭 파드 확인 > 정상적으로 배포되어 실행중인것을 확인 할 수 있다.

kubectl get deployment metrics-server -n kube-system

seungkim:~/environment $ kubectl get deployment metrics-server -n kube-system
NAME             READY   UP-TO-DATE   AVAILABLE   AGE
metrics-server   1/1     1            1           7m21s

2. HPA 리소스 생성

- YAML 파일로 작성할 코드를 생성한다. 파일명은 horizontal-pod-autoscaler.yaml 파일로 한다.

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: backend-app
  namespace: kube-example-zzanggu
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: backend-app
  minReplicas: 2
  maxReplicas: 5
  targetCPUUtilizationPercentage: 50

- 생성한 YAML 파일을 실행한다.

seungkim:~/environment $ kubectl apply -f horizontal-pod-autoscaler.yaml
horizontalpodautoscaler.autoscaling/backend-app created
seungkim:~/environment $ kubectl get hpa
NAME          REFERENCE                TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
backend-app   Deployment/backend-app   <unknown>/50%   2         5         0          71s

- 부하 발생기를 생성하여 pod에 부하를 발생시킨다.
- 부하 발생을 위한 pod를 실행시킨다.

seungkim:~/environment $ kubectl run -i --tty load-generator --image=busybox --rm -- sh

kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
If you don't see a command prompt, try pressing enter.

/ # while true; do wget -q -o- \
> http://backend-app-service.eks-work.svc.cluster.local:8080/health; done

- 부하 발생 화면

wget: bad address 'backend-app-service.eks-work.svc.cluster.local:8080'
wget: bad address 'backend-app-service.eks-work.svc.cluster.local:8080'
wget: bad address 'backend-app-service.eks-work.svc.cluster.local:8080'
wget: bad address 'backend-app-service.eks-work.svc.cluster.local:8080'
wget: bad address 'backend-app-service.eks-work.svc.cluster.local:8080'
wget: bad address 'backend-app-service.eks-work.svc.cluster.local:8080'
wget: bad address 'backend-app-service.eks-work.svc.cluster.local:8080'
wget: bad address 'backend-app-service.eks-work.svc.cluster.local:8080'
wget: bad address 'backend-app-service.eks-work.svc.cluster.local:8080'
wget: bad address 'backend-app-service.eks-work.svc.cluster.local:8080'
wget: bad address 'backend-app-service.eks-work.svc.cluster.local:8080'
wget: bad address 'backend-app-service.eks-work.svc.cluster.local:8080'
wget: bad address 'backend-app-service.eks-work.svc.cluster.local:8080'
wget: bad address 'backend-app-service.eks-work.svc.cluster.local:8080'
wget: bad address 'backend-app-service.eks-work.svc.cluster.local:8080'

- hpa 상태 조회: CPU 사용량이 50% 이상 증가하면 pod가 하나씩 증가하는 방식으로 설정되어 있다.
- MAXPODS가 5개로 설정되어 있고 최소 PODS는 2개로 설정되어 있는것을 확인 할 수 있다.

seungkim:~/environment $ kubectl get hpa -w
NAME          REFERENCE                TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
backend-app   Deployment/backend-app   <unknown>/50%   2         5         0          14m

- HPA에서는 기본값으로 스케일 아웃은 30초, 스케일 인은 5분에 한 번 동작한다.

- 끝 -