콘텐츠로 이동






kubernetes에서 수평확장을 위한 HPA소개

HPA의 의미

  1. HPA는 HorizontalPodAutoscaler의 약자이며, 워크로드의 부하에 따라 파드 수를 자동 조정하는 기능입니다.
  2. Kubernetes에서 말하는 수평 스케일링은 개별 파드의 자원을 키우는 것이 아니라, 파드 개수 자체를 늘리거나 줄이는 방식입니다.
  3. HPA는 Deployment, StatefulSet 같은 스케일 가능한 워크로드에 적용할 수 있고, DaemonSet처럼 크기 조절이 불가능한 오브젝트에는 적용할 수 없습니다.
  4. HPA는 애플리케이션의 부하가 증가하면 파드를 늘려 대응하고, 부하가 감소하면 파드를 줄여 리소스를 효율적으로 사용하는 Kubernetes의 자동 확장 기능인것 입니다.

Warning

Deployment의 replicas와 HPA의 minReplicas 값이 다를 경우, HPA가 활성화된 이후에는 HPA 설정이 자동 확장 기준으로 동작하므로 예상과 다른 파드 수가 유지될 수 있습니다.

HPA 작동원리

  1. HPA는 항상 상시 대기하는 프로세스가 아니라, 컨트롤러가 주기적으로 상태를 확인하는 control loop 방식으로 동작합니다
  2. 기본 동작 주기는 kube-controller-manager의 --horizontal-pod-autoscaler-sync-period에 의해 결정되며, 기본값은 15초입니다.

    back
    perplexity에서 생성한 AI이미지
  • 원하는 레플리카 수 = ceil(현재 레플리카 수 * 현재 메트릭 값 / 원하는 메트릭 값)

HPA 설치하기

  • HPA가 metrics.k8s.io API를 통해 메트릭을 가져오며, 이 API는 보통 metrics-server가 제공하기 때문에 HPA를 사용하려면 먼저 metrics-server가 필요합니다.
  1. metrics 설치하기
    1. 가장 일반적인 설치 방법은 metrics-server 매니페스트를 적용하는 것입니다. Kubernetes 공식 안내에서는 metrics-server를 클러스터에 별도로 실행해야 한다고 설명합니다.
      $> kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
      
    2. kubectl top node 실행결과
      $> kubectl top node
      bash
      NAME           CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
      worker-node-1   250m         12%    1200Mi          45%
      worker-node-2   180m         9%     980Mi           37%
      
      • 설치가 정상이라면 다음 명령으로 노드 메트릭을 볼 수 있습니다. kubectl top node는 노드별 CPU/메모리 사용량을 출력하며, 이는 metrics-server가 동작하고 있다는 의미입니다.

HPA 구성하기

  1. HPA 리소스를 생성합니다.

    • 특히 CPU 기반 Utilization은 requests 기준 사용률로 계산되므로, 컨테이너에 CPU request가 없으면 HPA가 올바르게 계산하지 못합니다. Kubernetes 문서에서도 리소스 요청이 없으면 CPU 사용률이 정의되지 않는다고 설명합니다.
  2. 적용을 위한 예시 아래 예시는 autoscaling/v2 기준의 HPA 샘플입니다. v2는 CPU뿐 아니라 메모리, 커스텀 메트릭, 여러 메트릭 조합, behavior 설정까지 확장해서 쓸 수 있어 실무에 더 적합합니다.

    $> cat hpa.yaml
    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: web-hpa                # HPA 리소스 이름
      namespace: default           # 대상 네임스페이스
    spec:
      scaleTargetRef:              # 어떤 워크로드를 스케일할지 지정
        apiVersion: apps/v1        # 대상 리소스의 API 버전
        kind: Deployment           # 대상 리소스 종류
        name: web                  # 대상 Deployment 이름
    
      minReplicas: 2               # 최소 파드 수
      maxReplicas: 10              # 최대 파드 수
    
      metrics:                     # 스케일 기준 메트릭 정의
        - type: Resource           # 리소스 기반 메트릭
          resource:
            name: cpu              # CPU 사용률 기준
            target:
              type: Utilization    # requests 대비 사용률 기준
              averageUtilization: 50  # 평균 CPU 사용률 50% 유지 목표
    
      behavior:                    # 스케일링 동작 세부 제어
        scaleUp:
          stabilizationWindowSeconds: 0   # 스케일업 안정화 윈도우
          policies:
            - type: Pods
              value: 4
              periodSeconds: 15           # 15초당 최대 4개까지 증가
            - type: Percent
              value: 100
              periodSeconds: 15           # 15초당 최대 100%까지 증가
          selectPolicy: Max                # 여러 정책 중 가장 많이 허용하는 정책 선택
    
        scaleDown:
          stabilizationWindowSeconds: 300   # 스케일다운 안정화 윈도우 5분
          policies:
            - type: Percent
              value: 50
              periodSeconds: 60            # 1분당 최대 50%까지 감소
          selectPolicy: Max
    

    • CPU 평균 사용률이 50%를 넘으면 파드를 늘리고, 낮아지면 천천히 줄이는 설정입니다
    • behavior는 꼭 넣어야 하는 필드는 아니지만, 운영 환경에서는 파드가 너무 빠르게 늘고 줄어드는 현상(thrashing)을 줄이기 위해 유용합니다.
  3. hpa 적용 후 적용값
    $> kubectl apply -f hpa.yaml
    $> kubectl get hpa
    NAME      REFERENCE        TARGETS    MINPODS   MAXPODS   REPLICAS   AGE
    web-hpa   Deployment/web   45%/50%    2         10        3          12m
    

Reference




back
perplexity에서 생성한 AI이미지



작성일: 2026년 7월 22일 ,  마지막 업데이트: 2026년 7월 22일