HPA(Horizontal Pod Autoscaler) 동작 원리

930 단어·2 분·원문(.md)

HPA는 Metrics API -> HPA Controller -> ReplicaSet/Deployment 조정 이 3단계로 움직인다.

  1. Metrics Server or Custom Metrics API에서 현재 지표를 수집함
  2. HPA Controller가 목표치와 비교해서 필요한 replica를 계산
  3. Deployment/ReplicaSet의 replicas 값을 실제로 PATCH 요청으로 업데이트
  4. Kube-controller-manager가 실제로 파드 수를 스케일 조정

구성요소 #

메트릭 제공자

  • cpu/memory: metrics-server
  • Prometheus based or applicaton based: custom metrics adapter

api 종류

  • resource metrics (Memory, CPU)
  • custom metrics (QPS, latancy)
  • external metrics (kafka lag, sqs length etc..)

즉 metrics는 기본 제공 서버 혹은 우리가 만들어놓은 메트릭 수집 서버 기반으로 돌고

HPA Controller가 그 지표를 기반으로 replica 수를 구하는 계산식을 통해 조정한다.

HPA Controller의 핵심 스케일 계산식 #

cpu 기준일때

desiredReplicas = ceil( currentReplicas × currentMetricValue / targetMetricValue )
  • 현재 3개
  • target cpu 60%
  • 실제 cpu 120%

라면

desired = ceil( 3 × 120 / 60 ) = ceil(6) = 6개

HPA가 Scale out/in 하는 조건 #

  • 스케일 아웃
    • 메트릭이 타겟값 이상이면 증가
    • 계산된 레플리카가 기존보다 크면 반영함
    • 기본 쿨다운 없음 (업 방향은 즉시 반영함)
  • 스케일 인
    • 기본적으로 빠르게 줄지 않도록 안정화 기간 존재함
    • --horizontal-pod-autoscaler-downscale-stabilization
    • 기본 5분
    • 즉, cpu가 잠깐 내려간다고 바로 줄이지 않는다.

HPA 안정화 로직 (Stabilization) #

HPA는 최근 5분동안 계산된 desired replicas 중 가장 큰 값을 유지하려고 한다.

  • 급격한 변동을 방지
  • 스케일 인이 갑자기 일어나지 않도록 제어

HPA가 Deployment를 조정하는 방식 #

HPA는 Deployment를 직접 변경하지 않고 다음 api를 호출한다.

PATCH /apis/apps/v1/namespaces/{ns}/deployments/{name}/scale

이 값이 변하면 Deployment controller가 새 pod를 생성/삭제한다.

동작 주기 (reconciliation loop) #

기본주기: 15초마다 체크 (--horizontal-pod-autoscaler-sync-period)

매 15초마다

  1. 최신 메트릭을 읽기
  2. 스케일 계산
  3. Stabilization 체크
  4. replicas PATCH

cpu 기반 hpa가 잘못 동작해서 과스케일이 된다면 #

  • metrics server가 15초 단위 스냅샷을 제공한다
    • 순간 spike 반영 시 오토스케일 된다
  • cpu throttling 발생시 잘못된값 증가
  • 컨테이너 요청량(request=100m ex)이 작으면 cpu가 높게 계산됨.

cpu% 계산 공식은 아래와 같다.

CPU% = (현재 CPU 사용량 / request 값) × 100

즉 request를 너무 낮게 잡으면 잘못 스케일링 된다.

Custom Metrics Based flow HPA #

prometheus adapter 기준이라면

  • prometheus adapter에서 /apis/custom.metrics.k8s.io 제공
  • hpa가 해당 api에 metric 요청
  • adapter가 prometheus에서 metric 쿼리
  • hpa controller가 계산해서 레플리카 결정

걍 똑같음

parameter #

최소/최대 레플리카수

minReplicas: 2
maxReplicas: 20

stabilizationWindowSeconds(scale in 제한)

behavior:
  scaleDown:
    stabilizationWindowSeconds: 300

정첵기반 조정비율 제한

behavior:
  scaleUp:
    policies:
      - type: Percent
        value: 100
        periodSeconds: 60
SRE/question/q_6.md