Kubernetes/Kubernetes Advanced

Kubernetes 리소스 시리즈 #14: Horizontal & Vertical Pod Autoscaler (오토스케일링 및 모니터링 리소스)

ygtoken 2025. 3. 5. 00:34
728x90

Kubernetes에서는 애플리케이션의 부하에 따라 자동으로 리소스를 조정할 수 있습니다.
이를 위해 **HPA(Horizontal Pod Autoscaler)와 VPA(Vertical Pod Autoscaler)**를 사용합니다.

이번 글에서는 HPA와 VPA의 개념, 차이점, 그리고 실전 활용법을 정리하겠습니다.


🔹 HPA (Horizontal Pod Autoscaler)란?

**HPA(Horizontal Pod Autoscaler)**는 CPU, 메모리 등의 사용량을 기준으로 Pod의 개수를 자동으로 조정하는 Kubernetes 리소스입니다.
✔️ 트래픽 증가 시 자동으로 Pod 개수를 증가
✔️ 트래픽 감소 시 불필요한 Pod를 줄여 리소스 절약
✔️ Deployment, StatefulSet 등의 리소스에 적용 가능

💡 HPA는 Pod 개수를 조절하는 방식이며, 개별 Pod의 리소스(CPU, 메모리)를 변경하지 않습니다.


🔹 HPA 예제 (CPU 기반 오토스케일링)

아래 예제는 CPU 사용률이 50%를 초과하면 Pod 개수를 1~10개 사이로 자동 조정하는 설정입니다.

apiVersion: autoscaling/v2  # HPA 리소스의 API 버전
kind: HorizontalPodAutoscaler  # HPA 리소스 선언
metadata:
  name: my-hpa  # HPA의 이름
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment  # HPA가 관리할 대상 (Deployment)
    name: my-deployment  # Deployment 이름
  minReplicas: 1  # 최소 Pod 개수
  maxReplicas: 10  # 최대 Pod 개수
  metrics:
    - type: Resource
      resource:
        name: cpu  # CPU 사용량 기준
        target:
          type: Utilization
          averageUtilization: 50  # CPU 사용률이 50% 초과 시 스케일 아웃

💡 위 설정이 적용되면, Pod의 CPU 사용량이 50%를 초과할 경우 자동으로 확장됩니다.


🔹 HPA 적용 및 상태 확인

kubectl apply -f hpa.yaml
kubectl get hpa

출력 예시:

NAME     REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
my-hpa   Deployment/my-app  60%/50%   1         10        3          5m

💡 현재 CPU 사용률이 50%를 초과하여 Pod 개수가 3개로 증가한 것을 확인할 수 있습니다.


🔹 HPA를 테스트하는 방법

HPA가 정상적으로 작동하는지 확인하려면, 트래픽을 증가시키는 부하 테스트를 수행하면 됩니다.

1️⃣ 부하 테스트 Pod 실행

kubectl run -it --rm load-generator --image=busybox -- /bin/sh

2️⃣ CPU 부하 발생

while true; do wget -q -O- http://my-service; done

💡 부하가 증가하면 HPA가 Pod 개수를 자동으로 늘리는지 확인할 수 있습니다.


🔹 VPA (Vertical Pod Autoscaler)란?

**VPA(Vertical Pod Autoscaler)**는 Pod의 리소스 요청/제한값을 자동으로 조정하는 Kubernetes 리소스입니다.
✔️ CPU, 메모리 사용량을 기반으로 Pod의 리소스를 자동 조정
✔️ 부족한 리소스를 자동으로 증가하여 안정적인 서비스 운영 가능
✔️ HPA와 함께 사용할 수 있지만, 같은 리소스에 대해 동시 적용은 불가능

💡 VPA는 개별 Pod의 리소스를 조정하지만, Pod 개수는 변경하지 않습니다.


🔹 VPA 예제 (CPU & 메모리 자동 조정)

아래 예제는 CPU 및 메모리 사용량을 모니터링하여 Pod의 리소스 요청값을 자동으로 조정하는 설정입니다.

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler  # VPA 리소스 선언
metadata:
  name: my-vpa  # VPA의 이름
spec:
  targetRef:
    apiVersion: apps/v1
    kind: Deployment  # VPA가 관리할 대상 (Deployment)
    name: my-deployment  # Deployment 이름
  updatePolicy:
    updateMode: "Auto"  # 자동으로 리소스 요청값 조정
  resourcePolicy:
    containerPolicies:
      - containerName: "*"
        minAllowed:
          cpu: "250m"  # 최소 CPU 0.25 vCPU
          memory: "256Mi"  # 최소 메모리 256Mi
        maxAllowed:
          cpu: "2"  # 최대 CPU 2 vCPU
          memory: "2Gi"  # 최대 메모리 2Gi

💡 Pod가 리소스를 과도하게 사용하면 자동으로 조정되며, 필요할 경우 재배포될 수 있습니다.


🔹 VPA 적용 및 상태 확인

kubectl apply -f vpa.yaml
kubectl get vpa

출력 예시:

NAME     MODE   CPU REQUEST   MEMORY REQUEST
my-vpa   Auto   500m          512Mi

💡 VPA가 Pod의 리소스 값을 자동으로 조정하고 있는 것을 확인할 수 있습니다.


🔹 HPA vs VPA 비교

기능 HPA (Horizontal Pod Autoscaler) VPA (Vertical Pod Autoscaler)

스케일 방식 Pod 개수를 조정 Pod의 CPU/메모리 리소스 조정
사용 목적 트래픽 증가 시 Pod 확장 개별 Pod 리소스 최적화
주로 사용하는 경우 부하에 따른 동적 확장 리소스 부족 시 자동 조정
HPA & VPA 동시 사용 ❌ 같은 리소스(CPU/메모리)에는 적용 불가 ❌ 같은 리소스(CPU/메모리)에는 적용 불가

💡 HPA는 Pod 개수를 조절하고, VPA는 개별 Pod의 리소스를 조절합니다.


🚀 마무리

✔️ HPA는 CPU/메모리 사용량을 기준으로 Pod 개수를 자동 조정
✔️ VPA는 CPU/메모리 사용량을 기준으로 개별 Pod의 리소스 요청값을 자동 조정
✔️ HPA와 VPA를 동시에 사용할 수 있지만, 같은 리소스(CPU/메모리)에는 적용할 수 없음

 

728x90