Kubernetes/Kubernetes Best Practices

[Scenario Playbook Ep.29] 🚀 HPA 편 #2 | 메모리 및 사용자 정의 메트릭 기반 확장

ygtoken 2025. 3. 16. 17:47
728x90

 

쿠버네티스의 HorizontalPodAutoscaler(HPA)는 CPU뿐만 아니라 메모리 및 사용자 정의 메트릭을 기반으로도 확장할 수 있습니다.

이번 글에서는 메모리 사용량을 기반으로 HPA를 설정하는 방법과 사용자 정의 메트릭(Custom Metrics)으로 확장하는 방법을 다룹니다.

 


📌 글에서 다루는 상황들

 

1️⃣ 메모리 사용량을 기반으로 자동 확장

2️⃣ 사용자 정의 메트릭(Custom Metrics) 기반 확장

 

각 문제를 실무에서 바로 활용할 수 있도록 Manifest 템플릿과 예상 결과 값을 제공합니다.

 


1️⃣ 메모리 사용량을 기반으로 자동 확장

 

❓ 문제 상황

 

운영팀에서 CPU 사용량이 아니라 메모리 사용량을 기준으로 HPA를 설정해야 하는 요구사항이 생겼습니다.

애플리케이션이 메모리를 많이 사용하는 경우, Pod의 개수가 자동으로 확장되어야 합니다.

Deployment의 이름은 hpa-memory-app이어야 합니다.

초기 Pod 개수는 1개이며, 최대 5개까지 확장 가능해야 합니다.

메모리 사용량이 200Mi를 초과하면 자동으로 확장되어야 합니다.

 

✅ 어떻게 해결할 수 있을까요?

 


🛠️ 해결 방법

 

1. HPA의 metrics 항목을 수정하여 메모리(memory) 사용량을 기준으로 확장하도록 설정해야 합니다.

averageValue: 200Mi → 메모리 사용량이 200MiB를 초과하면 확장

 

2. Pod에 메모리 부하를 발생시키고 HPA가 정상적으로 확장되는지 확인해야 합니다.

 


✅ 정답 Manifest (메모리 기반 HPA 설정)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hpa-memory-app  # Deployment 이름
spec:
  replicas: 1  # 초기 Pod 개수
  selector:
    matchLabels:
      app: hpa-memory-app  # 레이블 선택
  template:
    metadata:
      labels:
        app: hpa-memory-app  # Pod 레이블
    spec:
      containers:
      - name: memory-stress
        image: polinux/stress  # 메모리 부하 테스트용 이미지
        resources:
          requests:
            memory: "100Mi"
          limits:
            memory: "500Mi"
        args:
        - "--vm"
        - "1"
        - "--vm-bytes"
        - "250M"
        - "--vm-hang"
        - "0"
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-memory-app  # HPA 이름
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: hpa-memory-app  # HPA가 적용될 Deployment
  minReplicas: 1  # 최소 Pod 개수
  maxReplicas: 5  # 최대 Pod 개수
  metrics:
  - type: Resource
    resource:
      name: memory
      target:
        type: AverageValue
        averageValue: 200Mi  # 메모리 사용량이 200MiB를 초과하면 확장

 

 


📌 적용 후 예상 결과 값

 

1. Deployment 및 HPA 생성 확인

kubectl get deployment hpa-memory-app
kubectl get hpa

 

💡 예상 출력 값

NAME             READY   UP-TO-DATE   AVAILABLE   AGE
hpa-memory-app   1/1     1            1           5s
NAME             REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
hpa-memory-app   Deployment/hpa-memory-app   0/200Mi   1         5         1         5s

 

2. 메모리 부하 발생 후 Pod 개수 증가 확인

kubectl run --rm -it load-generator --image=polinux/stress -- --vm 1 --vm-bytes 300M --vm-hang 0

 

💡 예상 출력 값

NAME             REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
hpa-memory-app   Deployment/hpa-memory-app   250Mi/200Mi   1         5         3         1m

 

3. Pod 개수가 증가했는지 확인

kubectl get pods -l app=hpa-memory-app

 

💡 예상 출력 값

NAME                 READY   STATUS    RESTARTS   AGE
hpa-memory-app-xyz1  1/1     Running   0          1m
hpa-memory-app-abc2  1/1     Running   0          30s
hpa-memory-app-def3  1/1     Running   0          20s

 

 


2️⃣ 사용자 정의 메트릭(Custom Metrics) 기반 확장

 

❓ 문제 상황

 

운영팀에서 CPU나 메모리가 아닌, 사용자 정의 메트릭(Custom Metrics)을 기반으로 HPA를 설정해야 하는 요구사항이 생겼습니다.

예를 들어 애플리케이션의 요청 수(Request Count)가 일정 수준을 초과하면 자동으로 확장되도록 설정해야 합니다.

Deployment의 이름은 hpa-custom-metrics-app이어야 합니다.

prometheus-adapter를 사용하여 사용자 정의 메트릭을 적용해야 합니다.

초당 요청 수가 100을 초과하면 자동 확장되도록 설정해야 합니다.

 

✅ 어떻게 해결할 수 있을까요?

 


🛠️ 해결 방법

 

1. Prometheus Adapter를 사용하여 사용자 정의 메트릭을 HPA에 적용해야 합니다.

prometheus-adapter를 설치하여 사용자 정의 메트릭을 수집

 

2. HPA를 설정하여 특정 요청 수 이상이면 Pod이 확장되도록 설정해야 합니다.

 


✅ 정답 Manifest (사용자 정의 메트릭 기반 HPA 설정)

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-custom-metrics-app  # HPA 이름
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: hpa-custom-metrics-app  # HPA가 적용될 Deployment
  minReplicas: 1  # 최소 Pod 개수
  maxReplicas: 5  # 최대 Pod 개수
  metrics:
  - type: External
    external:
      metric:
        name: http_requests_per_second  # 사용자 정의 메트릭 이름
      target:
        type: AverageValue
        averageValue: "100"  # 초당 요청 수가 100을 초과하면 확장
728x90