TheKoguryo's 기술 블로그

 Version 2024.04.01

1.3.2 Horizontal Pod Autoscaler

  1. CPU 또는 메모리 기반의 Horizontal Pod Autoscaler를 사용하기 위해서는 먼저 Metrics Server의 설치가 필요합니다. Metrics Server가 설치가 되어 있는지 확인합니다.

    kubectl -n kube-system get deployment/metrics-server
    
  2. 샘플 애플리케이션을 배포합니다.

    kubectl apply -f https://k8s.io/examples/application/php-apache.yaml
    
    • 배포 파일

      • 500m cpu limit: 최대 500 밀리코어까지 사용할 수 있게 지정. 0.5 코어
      • 200m cpu request: 기본 200 밀리코어까지 사용할 수 있게 지정, 0.2 코어로 해당 자원은 보장받습니다.
      ...
          spec:
            containers:
            - name: php-apache
              image: registry.k8s.io/hpa-example
              ports:
              - containerPort: 80
              resources:
                limits:
                  cpu: 500m
                requests:
                  cpu: 200m
      ...         
      
  3. HPA 설정

    • Pod의 CPU 상태에 따라 최소 1개에서 최대 10개로 replica를 만들도록 HPA를 설정합니다.

      kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
      
  4. HPA 설정을 조회합니다.

    현재는 CPU 부하가 없는 상태로 Pod 1입니다.

    $ kubectl get hpa
    NAME         REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
    php-apache   Deployment/php-apache   0%/50%    1         10        1          66s
    
  5. 부하를 발생합니다.

    1. 부하 발생용 Pod를 만듭니다.

      kubectl run -it --rm load-generator --image=busybox /bin/sh
      
    2. Pod 안에서 다음명령을 실행하여 부하를 발생시킵니다.

      while true; do wget -q -O- http://php-apache; done
      
    3. 실행결과

      $ kubectl run -it --rm load-generator --image=busybox /bin/sh
      
      If you don't see a command prompt, try pressing enter.
      
      / # 
      / # while true; do wget -q -O- http://php-apache; done
      OK!OK!OK!OK!OK!OK!OK!OK!...
      
  6. 새 터미널을 열어서 다시 HPA 설정을 다시 조회합니다. 부하로 인해 Pod가 7개까지 늘어 난 것을 볼 수 있습니다.

    $ kubectl get hpa
    NAME         REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
    php-apache   Deployment/php-apache   50%/50%   1         10        7          8m25s
    
    $ kubectl top pod
    NAME                          CPU(cores)   MEMORY(bytes)   
    load-generator                17m          0Mi                 
    php-apache-7495ff8f5b-cngzz   147m         11Mi            
    php-apache-7495ff8f5b-g6hsr   105m         11Mi            
    php-apache-7495ff8f5b-h4wn6   72m          11Mi            
    php-apache-7495ff8f5b-jw9mq   76m          11Mi            
    php-apache-7495ff8f5b-kcbgw   147m         11Mi            
    php-apache-7495ff8f5b-vpcrj   150m         11Mi            
    php-apache-7495ff8f5b-wsf8c   73m          11Mi 
    
  7. 부하를 발생한 터미널로 돌아가 부하를 중지합니다. Ctrl+C 눌러 중지하고, exit 명령으로 컨테이너 밖으로 나옵니다.

  8. 현재 HPA 상태를 조회해 봅니다. 부하발생기의 종료로 현재 평균 CPU는 0이지만, 여전히 Pod는 7개 그대로인 상태입니다.

    $ kubectl get hpa
    NAME         REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
    php-apache   Deployment/php-apache   0%/50%    1         10        7          34m
    
  9. 기본 설정이라면, 5분이 지난후 다시 조회해 보면, Pod가 1개로 줄어든 것을 볼 수 있습니다.

    $ kubectl get hpa
    NAME         REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
    php-apache   Deployment/php-apache   0%/50%    1         10        1          40m
    
  10. HPA 관련 추가적인 설정과 기본 다운스케일 안정화 윈도우 설정값 등은 공식 문서를 참고합니다.



이 글은 개인으로서, 개인의 시간을 할애하여 작성된 글입니다. 글의 내용에 오류가 있을 수 있으며, 글 속의 의견은 개인적인 의견입니다.

Last updated on 26 Jan 2024