K8s 오토스케일링(HPA: Horizontal Pod Autoscaler)

Yuno·2025년 4월 6일

쿠버네티스 K8s

목록 보기
5/7

🚀 직접 부하를 주고, Pod 갯수가 늘어나는 걸 확인해보기

✨ 부하(Load) 란?

  • 사용자가 많은 요청을 동시에 보내거나, 애플리케이션이 무거운 작업을 많이 처리하게 되면 CPU 사용률이나 메모리 사용률이 올라감
    👉 이 것을 부하(Load) 라고 부름

✨ HPA 란?

⭐️ HPA = Horizontal Pod Autoscaler

  • K8s 에서 CPU 사용률이나 메모리 사용률 기준으로 Pod 개수를 자동으로 조절해주는 기능
    👉 너무 바쁘면 Pod 개수 늘리고, 한가하면 Pod 개수 줄여주는 조절기

🤔 왜 HPA 가 필요할까?

  • 사용자가 갑자기 많아져서 서버 하나로 감당 안 될 때, 새 Pod 들을 자동으로 추가해서 서비스 끊김 없이 대응

🚀 부하 = CPU 사용률 = 접속량

  • HPA는 예를들어, cpu-percent=50 설정일 때, 평균 CPU 사용량이 50% 넘으면 Pod 를 하나 더 늘려줌
개념설명
접속량 증가유저나 외부 시스템이 API 요청을 많이 보내는 상황
그로 인해CPU 사용률, 메모리 사용률, 네트워크 사용량 증가
결과적으로시스템에 "부하" 가 생기고, 리소스를 더 필요로 함
그래서K8s 가 Pod 를 자동으로 스케일 아웃 시킴(복제)
  • 예시
    • 평소에 1초에 10명 정도 접속하던 API 에
    • 갑자기 1초에 1,000명이 접속하면
    • 한 Pod 로는 감당 못하고 CPU 가 급상승
      → HPA가 감지하고 3개, 5개로 Pod 늘림
    • 사용량 줄어들면 다시 자동으로 줄어듬

🛠️ Step 1: Metrics Server 설치

✅ K8s 클러스터가 CPU 사용률을 알아야 하기 때문에 metrics-server 설치

minikube addons enable metrics-server

→ 반환

💡  metrics-server is an addon maintained by Kubernetes. For any concerns contact minikube on GitHub.
You can view the list of minikube maintainers at: https://github.com/kubernetes/minikube/blob/master/OWNERS
    ▪ Using image registry.k8s.io/metrics-server/metrics-server:v0.7.2
🌟  'metrics-server' 애드온이 활성화되었습니다

🛠️ Step 2: Spring 앱에 리소스 요청 / 제한 추가

✅ 기존 spring-k8s-deployment.yaml 파일에 resources 추가

spec:
  containers:
    - name: spring-k8s-demo
      image: spring-k8s-demo:v2
      imagePullPolicy: Never
      ports:
        - containerPort: 8080
      resources:
        requests:
          cpu: "100m" # 최소 0.1 core 필요
        limits:
          cpu: "200m" # 최대 0.2 core 까지 사용 허용

✅ 적용하기

kubectl apply -f spring-k8s-deployment.yaml

🛠️ Step 3: HPA 생성

kubectl autoscale deployment spring-k8s-demo \
  --cpu-percent=50 \
  --min=1 \
  --max=5
  • CPU 사용량이 50% 가 넘으면 Pod 늘리기
  • 최소 1개 ~ 최대 5개 까지 확장

✅ 확인

kubectl get hpa

→ 반환

NAME              REFERENCE                    TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
spring-k8s-demo   Deployment/spring-k8s-demo   cpu: 3%/50%     1         5         1          4m9s

🛠️ Step 4: 실제 부하 주기(스트레스 테스트)

✅ 테스트용 Pod 생성

kubectl run stress --rm -i --tty \
  --image=busybox \
  -- /bin/sh
파트설명
kubectl run stress이름이 stress 인 Pod 하나 생성
--rmPod 종료되면 자동 삭제 (임시 테스트용)
-i표준 입력을 받을 수 있게 해줌(쉘 사용 가능하게)
--tty터미널 세션을 만들 수 있게 함
--image=busyboxbusybox 이미지를 사용해서 컨테이너 실행
-- /bin/sh이 컨테이너에 들어갈 때 쉘을 실행해줘!

✅ 쉘 안에 들어가게 되면 부하 주기

while true; do wget -q -O- http://spring-k8s-service:8080/hello; done

→ 반환

Hello K8s! 🚀 this is version2!!Hello K8s! 🚀 this is version2!!Hello K8s! 🚀 this is version2!!Hello K8s! 🚀 this is version2!!Hello K8s! 🚀 this is version2!!Hello K8s! 🚀 this is version2!!
.... 무한반복

👉 1초에 수백~수천 번씩 요청을 날림
👉 CPU 점유율이 쭉 올라감
👉 K8s 가 "와, 이거 진짜 바쁘네?" → Pod 늘려줌

✅ 확인

kubectl get hpa

→ 반환

NAME              REFERENCE                    TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
spring-k8s-demo   Deployment/spring-k8s-demo   cpu: 134%/50%   1         5         3          7m51s
  • CPU 사용량이 50% 제한을 두었지만 134%로 급증한 상황
  • 이로 인해 Pod를 3개로 늘린 상황

시간이 지나 확인해보면..

NAME              REFERENCE                    TARGETS       MINPODS   MAXPODS   REPLICAS   AGE
spring-k8s-demo   Deployment/spring-k8s-demo   cpu: 3%/50%   1         5         1          1h
  • 다시 기존 수치로 돌아온 것을 확인
profile
Hello World

0개의 댓글