[Cloud] Kubernetes의 HPA를 활용한 오토스케일링(Auto Scaling)

Kubernetes에서 Auto Scaling이 잘되는지 테스트를 해보았습니다. 화면 덤프 등 내용 공유합니다.

Cloud 환경은 사용한 만큼 과금이 되기 때문에 가변적인 수요에 대응하기 적합합니다. Kubernetes(쿠버네티스)는 CPU 사용률 등을 체크하여 Pod의 개수를 Scaling하는 기능이 있습니다. 이것을 HorizontalPodAutoscaler(HPA, 수평스케일)로 지정한 메트릭을 Controller가 체크하여, 부하에 따라 필요한 Pod의 Replica수가 되도록 자동으로 Pod수를 늘리거나 줄일 수 있는 기술을 소개합니다.

1. Auto Scaling

1.1. Auto Scaling 활용 사례

Auto Scaling 서비스는 사용자가 정의한 주기(스케줄링)나 이벤트(모니터링 알람)에 따라 서버를 자동으로 생성하거나 삭제됩니다. 서비스에 사용자가 늘어나는 경우에는 원활한 서비스를 위해 서버를 늘리고, 다시 여유로운 상황이 되면 불필요한 서버를 자동으로 줄여 발생하는 요금을 낮출 수 있습니다.

https://docs.aws.amazon.com/ko_kr/autoscaling/ec2/userguide/what-is-amazon-ec2-auto-scaling.html

가령, 온라인 쇼핑몰의 접속자수가 적은날에는 어플리케이션 인스턴스(예 Pod)수를 한두개로 운영하다가 블랙프라이데이 등 사용자가 증가하는 날에는 동적으로 10개로 증가시켜 운영 한다는 시나리오가 가능합니다.

https://docs.aws.amazon.com/ko_kr/autoscaling/ec2/userguide/auto-scaling-benefits.html

1.2. Auto Scaling 메카니즘(적정 pod 개수)

Kubernetes는 다음과 같은 알고리즘을 통해 적절한 pod 개수를 유지합니다.

  • Horizontal Pod Autoscaler 컨트롤러는 원하는(desired) 메트릭 값과 현재(current) 메트릭 값 사이의 비율로 작동한다.
  • 원하는 Replica(레플리카) 수
    = ceil[현재 레플리카 수 * ( 현재 메트릭 값 / 원하는 메트릭 값 )]
  • 예를 들어 현재 메트릭 값이 200m이고 원하는 값이 100m인 경우 200.0 / 100.0 == 2.0이므로 복제본 수가 두 배가 된다.
    만약 현재 값이 50m 이면, 50.0 / 100.0 == 0.5 이므로 복제본 수를 반으로 줄일 것이다.
https://kubernetes.io/ko/docs/tasks/run-application/horizontal-pod-autoscale/

2. Scale 정책 설정

2.1.Deployment 설정(예)

  • 초기 Replica(Pod) 개수를 1개로 설정

2.2. HPA(HorizontalPodAutoscaler) 설정 (예)

  • 리소스(CPU) 자원 상태에 따라서 10개까지 Scaling 가능하도록 설정

2.3. CPU 부하를 주기 위한 소스

3. Scaling 모니터링(대량 접속전)

HPA 상태

  • Replica 개수(초기 1개)
    : $ while true ; do kubectl get hpa; sleep 5; done (5초 마다 hpa 조회)

4. 부하 발생(Jmeter로 동시 접속)

  • 성능테스트 도구인 jmeter를 이용하여 10만개의 Thread를 발생시켜 호출
    (예. 온라인 쇼핑몰에 10만명이 접속하여 상품 조회)

5. Scaling 모니터링(대량 접속 상황 발생 중)

5.1. HPA 상태

  • Pod(인스턴스)가 1 → 4개까지 증가
    (사용자 증가로 Replica/Pod/Process 당 사용할 수 있는 CPU 증가로 새로운 Replica/Pod/Process를 추가)
  • Pod(인스턴스)가 4 → 8개까지 증가
  • Pod(인스턴스)가 8 → 10개까지 증가

5.2. Scaling된 pod 활용

다음과 같이 여러개의 pod에 분산되어 서비스를 제공합니다.

  • 10개의 pod가 실행 됨
  • 다양한 pod에 분산되어 서비스 처리

6. Scaling 모니터링(대량 접속 상황 종료)

6.1. HPA 상태

  • Pod(인스턴스)가 10 → 2개까지 감소
  • Pod(인스턴스)가 2 → 1개까지 감소

6.2. Pod 상태

  • 초기 설정값이 pod 1개 유지

참고자료

이상으로 Kubernetes에서 접속자 증가에 따른 pod를 동적으로 Scaling하는 방법을 소개하였습니다.

--

--