HPA(Horizontal Pod Autoscaler) 동작 원리
HPA는 Metrics API -> HPA Controller -> ReplicaSet/Deployment 조정 이 3단계로 움직인다.
- Metrics Server or Custom Metrics API에서 현재 지표를 수집함
- HPA Controller가 목표치와 비교해서 필요한 replica를 계산
- Deployment/ReplicaSet의 replicas 값을 실제로 PATCH 요청으로 업데이트
- 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초마다
- 최신 메트릭을 읽기
- 스케일 계산
- Stabilization 체크
- 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