ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Kubernetes (K8S): HPA(Horizontal Pod Autoscaling)
    공부합시다!/Kubernetes 2023. 7. 4. 22:07
    728x90

    오늘은  K8S의 AutoScaling기능을 담당하는  HPA(Horizontal Pod Autoscaling: 이하 HPA)에 대해서 살펴보겠습니다.

     

    1. HPA 의의

     1.1. 워크로드 리소스(예: Deployment또는 StatePullSet)를 자동으로 업데이트하며, 워크로드의 크기를 수요에 맞게 자동으로 스케일링.

     1.2. 수평 스케일링은 부하 증가에 대해 파드를 더 배치하는 것을 뜻함.

     1.3. 부하량이 줄어들고, 파드의 수가 최소 설정값 이상인 경우, HorizontalPodAutoscaler는 워크로드 리소스(디플로이먼트, 스테이트풀셋, 또는 다른 비슷한 리소스)에게 스케일 다운을 지시.

     1.4. HPA는 크기 조절이 불가능한 오브젝트(예: Daemonset)에는 적용할 수 없음.

     1.5. HAP는 쿠버네티스 API 자원 및Controller  형태로 구현.

     1.6. HPA API 자원은 Controller의 행동을 결정함.

     1.7. K8S Control Plane 내에서 실행되는 HPA 컨트롤러는 평균 CPU 사용률, 평균 메모리 사용률, 또는 다른 커스텀 메트릭 등의 관측된 메트릭을 목표에 맞추기 위해 목표물: Deployment 등의 적정 크기를 주기적으로 조정.

     

    2. 동작방식

     2.1. K8S는 HPA를 간헐적으로(intermittently) 실행되는 컨트롤 루프 형태로 구현했다(지속적인 프로세스가 아님).

     2.2. 실행 주기는Kube-Controller-Manager 의 --horizontal-pod-autoscaler-sync-period 파라미터에 의해 설정.

     2.3. 기본 주기는 15초.

     2.4. 각 주기마다, 컨트롤러 매니저는 각 HPA 정의에 지정된 메트릭에 대해 리소스 사용률을 질의.

     2.5. 컨트롤러 매니저는 scaleTargetRef에 의해 정의된 타겟 리소스를 찾고 나서, 타겟 리소스의 .spec.selector 레이블을 보고 파드를 선택하며, 리소스 메트릭 API(파드 단위 리소스 메트릭 용) 또는 커스텀 메트릭 API(그 외 모든 메트릭 용)로부터 메트릭을 수집.

      2.5.1. 파드 단위 리소스 메트릭(예 : CPU)의 경우 컨트롤러는 HorizontalPodAutoscaler가 대상으로하는 각 파드에 대한 리소스 메트릭 API에서 메트릭을 수집. 그런 다음, 목표 사용률 값이 설정되면, 컨트롤러는 각 파드의 컨테이너에 대한 동등한 자원요청을 퍼센트 단위로 하여 사용률 값을 계산. 대상 원시 값이 설정된 경우 원시 메트릭 값이 직접 사용된다. 그리고, 컨트롤러는 모든 대상 파드에서 사용된 사용률의 평균 또는 원시 값(지정된 대상 유형에 따라 다름)을 가져와서 원하는 레플리카의 개수를 스케일하는데 사용되는 비율을 생성

      2.5.2. 파드의 컨테이너 중 일부에 적절한 리소스 요청이 설정되지 않은 경우, 파드의 CPU 사용률은 정의되지 않으며, 따라서 오토스케일러는 해당 메트릭에 대해 아무런 조치도 취하지 않음

      2.5.3. 파드 단위 사용자 정의 메트릭의 경우, 컨트롤러는 사용률 값이 아닌 원시 값을 사용한다는 점을 제외하고는 파드 단위 리소스 메트릭과 유사하게 작동.

    원하는 레플리카 수 = ceil[현재 레플리카 수 * ( 현재 메트릭 값 / 원하는 메트릭 값 )]

    ceil의 최소 정수값(천정함수)이란 의미로 3.4 이면 4 의미한다. 값의 바로 위 정수값을 취한다.

     

    3. 실습(반드시 K8S Plugin Metrics Server가 설치 되어 있어야 합니다.)

    apache web server에 부하를 발생시켜 ScaleOut, ScaleIn 측정

     3.1. apache web server 실행하는 Deployment 및 svc 생성

     

     3.2. autoscale 설정

    https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#autoscale

    # kubectl autoscale deployment scaledep-apache --cpu-percent=70 --min=1 --max=5

     

    예제설명:

    HPA 컨트롤러는 평균 CPU 사용량을 50%로 유지하기 위해 (디플로이먼트를 업데이트하여) 레플리카의 개수를 늘리고 줄인다. 그러면 디플로이먼트는 레플리카셋을 업데이트하며(이는 모든 쿠버네티스 디플로이먼트의 동작 방식 중 일부이다), 레플리카셋은 자신의 .spec 필드의 변경 사항에 따라 파드를 추가하거나 제거한다.

    kubectl run으로 각 파드는 200 밀리코어를 요청하므로, 평균 CPU 사용은 100 밀리코어임.

     

     3.3. HAP 상태확인

    # kubectl get hpa

     3.4. 부하 증가 시키기

      3.4.1. busybox를 컨테이너를 실행하여 Service Object인 svc-apache 에 부하 증가 시키기

       3.4.1.1. 부하 발생 전

     

       3.4.1.2. 부하 발생 후

      # kubectl run -i --tty load-generator --rm --image=busybox:1.28 --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://svc-apache; done"

      3.4.2. 부하 확인 및 replicas 증가

       3.4.2.1. replicas 증가

       3.4.2.2. pod 증가 확인

     

     3.5. 부하 발생 중지

      3.5.1. 부하 발생 중지 후 replicas  확인(5분이상 필요)

     

     3.6. yaml 파일 확인

      3.6.1. hpa yaml 내보내기

      #  kubectl get hpa scaledep-apache -o yaml > hpa-v1.yml

      3.6.2. hpa yaml 파일 확인

      # vi hpa-v1.yml

     

    온프레미스 환경이라면 반드시 구성을 해보셔야할 사항 입니다.

      

    728x90
Designed by Tistory.