metrics server와 HPA를 이용한 autoscaling 테스트

2025. 2. 25. 14:34Kubernetes/AutoScaling


# 테스트 환경

  • OS : Ubuntu 24.04 LTS
  • kubectl : v1.30.0

 

Kubernetes의 autoscaling 방법 중 하나인 HPA를 이용한 autoscaling 테스트를 진행하였다.

 

HPA

Horizontal Pod Autoscaler는 K8S에서 제공하는 기능으로 CPU, 메모리 사용량 또는 사용자 정의 메트릭에 따라 Pod의 수를 자동으로 확장 또는 축소하는 기능

 

주요 기능

1. 자동 확장 및 축소 : CPU, 메모리 사용량이 증가하면 pod 수를 자동으로 늘리고 사용량이 감소하면 자동으로 줄임

 

2. 리소스 최적화 : 트래픽 변화에 유연하게 대응하며 과도한 리소스 사용을 방지 가능

 

3. 확정성 보장 : 사용량 증가 시 빠르게 pod 수를 확장해 서비스의 안정성을 유지

 

동작 방식

1. metrics-server에서 리소스 사용량을 수집

 

2. 정의한 임계치와 수집된 실제 리소스 사용량을 비교

 

3. 임계치보다 사용량이 높으면 pod 수를 늘리고 낮아지면 pod 수를 감소 시킴

 

 

Test Case

 

hpa-test.yaml

cpu 부하 테스트를 진행할 Deployment를 정의한 yaml 파일

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hpa-cpu-test
  labels:
    app: hpa-cpu-test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: hpa-cpu-test
  template:
    metadata:
      labels:
        app: hpa-cpu-test
    spec:
      containers:
      - name: cpu-stress
        image: polinux/stress # stress를 사용하기 위한 이미지
        command:
          - sh
          - -c
          - |
            #!/bin/bash
            i=2
            # 부하 증가를 한 번만 실행할 수 있도록 flag 추가
            increase_done=false
            while true; do
              # CPU 부하 증가 (i가 5 이하일 때만 실행, 한 번만 증가)
              if [ $i -le 5 ] && [ "$increase_done" = false ]; then
                echo "CPU 부하 증가 중: $i"
                stress --cpu 1 --timeout 30s &  # stress로 CPU 부하 증가
                i=$((i + 1))  # 부하 증가
                increase_done=true  # 부하 증가 완료 표시
              fi

              # 부하를 점진적으로 줄이기 위한 로직 (30초 후)
              sleep 30

              # 부하 감소 (i가 2를 초과한 후에만 실행)
              if [ $i -gt 2 ]; then
                echo "CPU 부하 감소 중: $i"
                # stress 프로세스 종료
                pkill stress  # stress 프로세스 종료
                sleep 30
                i=$((i - 2))  # 부하 감소
              fi

              # i가 0이면 종료
              if [ $i -eq 0 ]; then
                echo "CPU 부하 제거 완료: i = $i"
                break  # 무한 루프 종료
              fi
            done
        resources:
          requests:
            cpu: "200m"    # 최소 CPU 요청량
          limits:
            cpu: "400m"    # 최대 CPU 제한량

 

hpa.yaml

hpa-cpu-test Deployment에 대한 cpu 부하 테스트 진행 시 설정할 hpa 정보들을 정의한 yaml 파일

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: cpu-test-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: hpa-cpu-test  # 해당 hpa를 적용하고자 하는 Deployment 명
  minReplicas: 1  # 최소 유지 pod 갯수
  maxReplicas: 6  # 최대 유지 pod 갯수
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 50  # CPU 사용량이 50 이상일 때 pod 수 확장, 반대로 50이하일 때 pod 수 축소
  behavior:  # 스케일 인/아웃 속도 설정
    scaleDown:
      stabilizationWindowSeconds: 30  # Pod 축소 확인 주기를 30초로 단축

 

 

1. Deployment와 HPA를 apply 하기

# Deployment
kubectl apply -f hpa-cpu-test.yaml

# HPA
kubectl apply -f hpa.yaml

 

 

2. 정상 apply 되었는지 확인

# Deployment
kubectl get deployment

# HPA
kubectl get hpa

 

deployment와 hpa 배포 확인

 

3. 배포된 hpa를 통해 scale up / down 확인

kubectl get hpa -w

 

 

Test 결과

 

kubectl get hpa -w 명령어는 기본적으로 변경 사항을 15초에 한 번씩 실시간으로 보여준다.

 

최초에 stress 부하를 가하자 185%까지 늘어난 사용량으로 인해 pod의 수가 1개  → 4개  → 6개로 점차 늘어나는 것이 확인 가능하다.

 

부하를 주는 if문이 종료되고 부하를 주던 stress 프로세스를 삭제하자 cpu 사용량이 점차 줄어들고 그에 따라서 pod의 수도 6개 → 3개 → 1개 순서로 점차 줄어드는 것이 확인 가능하다.