쿠버네티스 파드 확장에 대한 이해 (HPA, VPA, KEDA)

온프레미스 K8s 클러스터 구축하기 - 이론 및 검증 2 (작성 중...)
이민석's avatar
Mar 30, 2025
쿠버네티스 파드 확장에 대한 이해 (HPA, VPA, KEDA)

💡

이 문서는 결함 주입(Fault Injection)을 통해 가설 및 검증 과정을 거쳤습니다.

A.

A.1. 기본 개념

파드의 스케일링을 위해서 사용되는 3가지 개념을 소개합니다.

용어

설명

HPA

Horizontal Pod Autoscaler
타켓의 매트릭과 일정 수치를 기준으로 ReplicaSet의 replicas를 조절

VPA

Vertical Pod Autoscaler
타켓의 매트릭과 일정 수치를 기준으로 Pod Resource(CPU, Memory)를 조절

KEDA

Kubernetes based Event Driven Autoscaler
특정 이벤트를 기반으로 ReplicaSet의 replicas를 조절

B. 실습 사례

B.0. 테스트 도구 설치

  1. hey 설치하기

    sudo apt update -y
    sudo apt install -y hey

B.1. HPA 기본

쿠버네티스의 HPA는 워크로드의 크기를 수요에 맞게 자동으로 스케일링 합니다.
kube-controller-manager는 일정 주기*마다 각 HPA에 맞는 스케일링을 합니다.

💡

[일정 주기*] --horizontal-pod-autoscaler-sync-period=15s (default)

HPA는 스케일링을 하기 위해서 매트릭에 의존하는데,
이 매트릭은 일반적으로 metrics-server에 의존하게 됩니다.

💡

metrics.k8s.io : 네이티브 쿠버네티스 매트릭 API custom.metrics.k8s.io : 사용자 정의 애플리케이션 매트릭 API external.metrics.k8s.io : 쿠버네티스 외부 시스템 매트릭 API

기본적으로 현재 매트릭(current)와 원하는 매트릭(desire)의 비율로 작동합니다.
kube-controller-manager는 조정 오차* + 비율이 1.0이면 이를 건너뜁니다.

💡

[조정 오차*] --horizontal-pod-autoscaler-tolerance=0.1 (default)

설명의 편의를 위해서 조정 오차가 0.0이라고 한다면,
원하는 매트릭이 200m인데 현재 매트릭이 400m이면 레플리카도 2배로 늘어납니다.

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

또한 HPA는 파드가 준비 되었는지 판단할 기능이 제공되지 않습니다.
따라서 일정 시간* 동안 준비되지 않음(not yet ready)로 갈음합니다.

💡

[일정 시간* 동안 준비되지 않음(not yet ready)로 갈음] --horizontal-pod-autoscaler-initial-readiness-delay=30s (default) 파드는 무조건 30초 정도는 시작되지 않음으로 갈음 --horizontal-pod-autoscaler-initialization-period=5m (default) 파드가 준비(ready)가 되어도 무조건 5분은 해당 매트릭을 사용하지 않음

때로 HPA는 급격한 파드 축소로 인한 서비스 장애를 유발하기도 합니다.
따라서 구성 가능한 창(Window)에서 가장 높은 권장사항*을 따르도록 구현됩니다.

💡

[구성 가능한 창에서 가장 높은 권장사항*] --horizontal-pod-autoscaler-downscale-stabilization=5m (default)

누락된 매트릭이 있는 파드,
준비되지 않은 파드(갈음*된 파드),
실행에 실패한 파드(삭제 중인 파드) 등은 원하는 매트릭(desire)의 0%를 소모한다고 판단하며, 결과적으로 현재 매트릭(current)에는 포함되지 않습니다.

  1. Namespace, Service, Deployment, HPA 배포하기

    kubectl apply -f https://raw.githubusercontent.com/unchaptered/onpremise-kubernetes/1e766cb23835572c39c062a9783ba2ae8fa87dfd/pod-autoscaler/1-hpa-basic.yaml
  2. HPA, Service, Deploy, ReplicaSet, Pod 확인하기

    kubectl get hpa,svc,deploy,rs,pod -n pod-autoscaler \
      -o=custom-columns="TYPE:.kind,NAMESPACE:.metadata.namespace,NAME:.metadata.name"
    TYPE                      NAMESPACE        NAME
    HorizontalPodAutoscaler   pod-autoscaler   hpa-01-basic
    Service                   pod-autoscaler   hpa-01-basic
    Deployment                pod-autoscaler   hpa-01-basic
    ReplicaSet                pod-autoscaler   hpa-01-basic-6cd47c8df5
    Pod                       pod-autoscaler   hpa-01-basic-6cd47c8df5-fffvj
    Pod                       pod-autoscaler   hpa-01-basic-6cd47c8df5-zpcfb
  3. Prometheus, Grafana 대시보드 구성하기

  4. dddd

B.2. HPA 확장 및 축소 정책

HPA scaleUp, Down의 기본동작 [B.2 -1]은 다음과 같습니다.

Option

scaleUp

scaleDown

stabilizationWindowsSeconds

0

300

Percent (value | periodSeconds)

100 | 15

100 | 15

Pod (value | periodSeconds)

4 | 15

각 옵션에 대해서 selectPolicy를 선택할 수 있습니다.

Option

Description

Disable

자동 크기 조정 정책을 비활성화

Min

복수의 정책 중 가장 작은 값을 적용

Max

복수의 정책 중 가장 큰 값을 적용

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hpa-01-basic
spec:
  replicas: 2
  template:
    spec:
      containers:
      - name: hpa-01-basic
        resources:
          requests:
            cpu: 200m
            memory: 256Mi
          limits:
            cpu: 500m
            memory: 512Mi
---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-01-basic
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: hpa-01-basic
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70
  behavior:
    scaleUp:
      stabilizationWindowsSeconds: 60
      policies:
      - type: Percent
        value: 100
        periodSeconds: 60
      - type: Pods
        value: 4
        periodSeconds: 60
      selectPolicy: Max
    scaleDown:
      stabilizationWindowSeconds: 300
      policies:
      - type: Percent
        value: 25
        periodSeconds: 120
      - type: Pods
        value: 2
        periodSeconds: 120
      selectPolicy: Min

B.3. HPA 다양한 매트릭 유형

Resource Metric [B.3 - 1]

  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 60

Container Resource Metric [B.3 - 2]

type: ContainerResource
containerResource:
  name: cpu
  container: application
  target:
    type: Utilization
    averageUtilization: 60

Metric API [B.3 -3]

Custom Metric API [B.3 - 4]

Multiple Metric [B.3 - 5]

B.3. HPA 복수의 매트릭

B.4. HPA 매트릭 API

B.5. HPA 커스텀 매트릭

참고 문서

  1. Velog (access.log) — [AEKS2] 5주차 — EKS AutoScaling: HPA, VPA, KEDA

  2. DevTo (Yash Londhe) — Scaling Applications in Kubernetes with Horizontal Pod Autoscaling: A Deep Dive

  3. ddd

  4. dddd

Share article

Unchaptered