dh_0e

[Cloud] HPA (Horizontal Pod Autoscaling) 본문

Cloud/Kubernetes

[Cloud] HPA (Horizontal Pod Autoscaling)

dh_0e 2026. 6. 3. 16:12

Pod의 AutoScaling 방법

  • 운용 중인 Pod의 서비스 상황에 따라 Pod의 수 또는 Pod에 할당된 리소스의 양을 자동으로 조정
    • 수요변화와 서비스 품질등을 고려하여 적정하게 자동으로 스케일링

Scale Out(In) / Scale Up(Down)

  • HPA(Horizontal Pod Autoscaler, 수평 스케일링)
    • Pod의 개수늘리거나(out) 줄임(in)
    • Scale out, Scale in
  • VPA(Vertical Pod Autoscaler, 수직 스케일링)
    • 해당 워크로드를 위해 이미 실행 중인 Pod에 더 많은 자원(메모리, CPU) 할당(up) 또는 해제(down)
    • Scale up, Scale down

 

HPA (Horizontal Pod Autoscaler)

  • 개념
    • Application의 부하에 따라 Deployment나 ReplicaSet 등에 적용하여 포함된 Pod 수를 자동으로 조정
    • CPU 사용률, 메모리 사용량, 사용자 정의 메트릭 등 특정 메트릭 기반
      • 메트릭: 시스템 상태를 수치로 나타낸 값 (예: CPU 사용률, 메모리 사용량, 초당 요청 수(RPS) 등)
    • ex) 부하가 늘어나면 Pod를 일시적으로 늘리고, 부하가 줄어들면 다시 Pod의 숫자를 줄여 서버 내 자원을 효율적으로 관리
  • Metric 종류
    • 리소스 메트릭: CPU 사용률 메모리 사용률을 모니터링하여 스케일링 결정
    • 사용자 정의 메트릭: Application 요구에 맞게 정의한 메트릭
      • ex) HTTP 요청 수, 응답 시간 등
    • 외부 메트릭: Kubernetes 외부에서 수집된 메트릭
      • ex) 외부 API 응답 시간, 클라우드 서비스 제공자의 서비스 사용량 등

Need for HPA

  • 장점
    • 서비스 품질 향상
    • 비용 관리 향상

Metric을 통한 HPA 과정

  1. 메트릭 서버: Kubelet으로부터 메트릭을 가져옴
  2. HPA 컨트롤러: 15초마다 메트릭 서버에서 메트릭을 조회
  3. HPA 컨트롤러: 원하는 복제본 수를 계산
  4. HPA 컨트롤러: API 서버를 통해 관련 Deployment를 업데이트
  5. Deployment 컨트롤러: 이를 처리하여 ReplicaSet을 업데이트, 그 결과로 Pods의 수가 변경

Metrics Server

  • Metrics Server K8s 클러스터에서 CPU 및 메모리와 같은 메트릭 데이터를 수집하고, 클러스터 운영 및 오토 스케일링(HPA, VPA)에 필요한 실시간 모니터링 정보를 제공해 줌
    • HPA와 VPA와 같은 오토스케일러는 직접 Pod 상태를 보는 것이 아니라, API Server를 통해 제공되는 메트릭 정보를 읽어서 스케일링 여부를 결정

 

HPA 구동방법

  • "kubectl autoscale" 명령을 통해 horizontalPodAutoscaler(HPA) 생성
    • 또는 yaml 파일로 kubectl apply -f 해서 배포 가능

HPA yaml file

  • min, maxReplicas: 스케일링 시에 최대, 최소 Replica 개수
  • metrics.type: 어떤 타입의 metric 인지
  • metrics.resource
    • name: metric 종류
    • target: 어떤 조건에서 스케일링하는지  
      • averageUtilization(cpu 혹은 memory 사용량)이 50%가 되면 Scale up
      • 현재 resource.name이 cpu이므로 cpu 사용령이 50%가 되면 Scale up
metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50
  - type: Resource       # 메모리 조건 추가
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 60  # 메모리가 60%를 넘을 때
  • CPU와 Memory를 모두 감시하기 위한 yaml 파일의 metrics
  • 위와 같이 설정하면, CPU가 50%를 넘거나, 메모리가 60%를 넘을 때 HPA 작동

 

HPA 작동 방식

  • 메트릭 모니터링
    • 일정 주기(Default: 15s)마다 CPU 사용량, 메모리 사용량, 커스텀 메트릭 or 외부 메트릭을 모니터링
    • Kubernetes API 서버에 등록된 메트릭 서버외부 모니터링 도구를 통해 수집
      • 외부 모니터링 도구 ex) 외부 API 응답 시간(Kubernetes와 직접 연관되지 않은 외부트래픽에 따른 값)
  • 임계값 평가
    • HPA는 목표 메트릭 값(Target Metric)현재 메트릭 값을 비교하여 임계값 초과 여부를 평가
      • ex 1) 목표 CPU 사용률이 60%로 설정된 경우, 현재 CPU 사용률이 70%를 넘는다면 Scale out이 필요하다고 판단
      • ex 2) 현재 CPU 사용률이 50%라면 Scale in이 필요하다고 판단
  • Pod 스케일링
    • 측정된 메트릭 값이 임계값을 초과하면 HPA는 Pod 수를 늘려서 부하를 분산
    • 측정된 메트릭 값이 임계값 이하로 떨어지면 불필요한 Pod 수를 줄여 리소스 낭비를 방지
    • 목표 메트릭 값 대비 현재 메트릭 값의 비율을 계산하여 Pod 수 결정

HPA가 Pod 수를 결정할 때 사용하는 뼈대가 되는 공식 (현재는 다양한 커스텀 Metrics 사용)

  • n%의 기준점
    • HPA가 "CPU 사용량이 50%에 도달했다"라고 판단하려면 전체 100%가 얼마인지 아는 기준점이 필요
    • Deployment(php-apache) 안의 Pod 설정 중 resources.requests.cpu에 할당된 값을 기준으로 계산
      • Downward API로 확인할 수 있었음

php-apache.yaml

  • resources: 필드
    • 각 컨테이너에 대한 리소스 요청 및 제한 정의
    • limits:
      • 컨테이너가 사용할 수 있는 리소스의 최대치
      • "cpu: 500m"는 컨테이너가 최대 500밀리 코어(0.5 코어)의 CPU를 사용할 수 있도록 제한
    • requests:
      • 컨테이너가 기본적으로 필요한 리소스의 양
      • HPA는 request 값을 기준으로 CPU target 사용량(%)을 설정

 

HPA 급격한 변화 방지

spec >> Scale-down 동작 설정

  • 메트릭 변동으로 인해 Pod 수가 급격하게 변동하는 것을 방지하기 위한 scaleDwon 동작 설정

안정화 윈도우

  • 메트릭 변동으로 인해 Pod 수가 급격하게 변동하는 것을 방지하기 위한 시간 범위 설정
  • 스케일링을 수행하기 전, 지정된 윈도우 동안 수집된 메트릭 값 중 가장 높은 값을 사용하여 스케일링 여부를 결정
    • 위 예시) 300s 동안 수집된 메트릭 값 중 가장 높은 값을 사용
  • 불필요한 스케일 다운을 방지하고, 안정성을 유지할 수 있음

통합 예시