Kubernetes/Kubernetes Best Practices

[Scenario Playbook Ep.30] 🚀 HPA 편 #3 | HPA와 Cluster Autoscaler 연동

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

 

쿠버네티스에서 HorizontalPodAutoscaler(HPA)는 Pod의 개수를 자동으로 조절하지만, 클러스터 내 리소스가 부족하면 확장이 제한될 수 있습니다.

이를 해결하기 위해 Cluster Autoscaler를 연동하면, 필요한 경우 노드를 자동으로 추가하여 확장성을 극대화할 수 있습니다.

이번 글에서는 HPA와 Cluster Autoscaler를 함께 설정하여 원활한 확장 환경을 구축하는 방법을 다룹니다.

 


📌 글에서 다루는 상황들

 

1️⃣ HPA 적용 후 노드 리소스 부족 시 확장 문제 발생

2️⃣ Cluster Autoscaler 연동을 통한 자동 노드 확장

 

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

 


1️⃣ HPA 적용 후 노드 리소스 부족 시 확장 문제 발생

 

❓ 문제 상황

 

운영팀에서 HPA를 적용하여 트래픽 증가 시 자동으로 Pod을 확장하도록 설정했지만, 클러스터 리소스가 부족하면 확장이 불가능한 문제가 발생했습니다.

현재 실행 중인 노드에서 더 이상 추가적인 Pod을 실행할 리소스가 없기 때문에 새로운 노드가 자동으로 추가될 수 있도록 Cluster Autoscaler와 연동해야 합니다.

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

Pod 개수를 1개에서 최대 10개까지 자동 확장하도록 설정해야 합니다.

클러스터의 리소스가 부족할 경우, 새로운 노드가 자동으로 추가되어야 합니다.

 

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

 


🛠️ 해결 방법

 

1. HPA를 설정하여 CPU 사용량을 기준으로 Pod 개수를 자동 조절하도록 구성해야 합니다.

minReplicas: 1 → 최소 1개

maxReplicas: 10 → 최대 10개까지 확장

targetCPUUtilizationPercentage: 50 → CPU 사용량이 50% 이상이면 확장

 

2. Cluster Autoscaler를 활성화하여 노드 리소스가 부족할 경우 자동으로 추가되도록 설정해야 합니다.

 


✅ 정답 Manifest (HPA 설정 - CPU 기반 확장)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hpa-cluster-app  # Deployment 이름
spec:
  replicas: 1  # 초기 Pod 개수
  selector:
    matchLabels:
      app: hpa-cluster-app  # 레이블 선택
  template:
    metadata:
      labels:
        app: hpa-cluster-app  # Pod 레이블
    spec:
      containers:
      - name: cpu-stress
        image: vish/stress  # CPU 부하 테스트용 이미지
        resources:
          requests:
            cpu: "100m"
          limits:
            cpu: "500m"
        args:
        - "-cpus"
        - "1"  # CPU 부하 발생
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-cluster-app  # HPA 이름
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: hpa-cluster-app  # HPA가 적용될 Deployment
  minReplicas: 1  # 최소 Pod 개수
  maxReplicas: 10  # 최대 Pod 개수
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50  # CPU 사용량이 50% 이상이면 확장

 

 


📌 적용 후 예상 결과 값

 

1. Deployment 및 HPA 생성 확인

kubectl get deployment hpa-cluster-app
kubectl get hpa

 

💡 예상 출력 값

NAME              READY   UP-TO-DATE   AVAILABLE   AGE
hpa-cluster-app   1/1     1            1           5s
NAME              REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
hpa-cluster-app   Deployment/hpa-cluster-app   0%/50%   1         10        1         5s

 

 


2️⃣ Cluster Autoscaler 연동을 통한 자동 노드 확장

 

❓ 문제 상황

 

운영팀에서 HPA를 적용했지만, 클러스터의 리소스가 부족하여 Pod 확장이 불가능한 문제가 발생했습니다.

Cluster Autoscaler를 연동하여 새로운 Pod을 수용할 수 있는 노드를 자동으로 추가해야 합니다.

 

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

 


🛠️ 해결 방법

 

1. Cluster Autoscaler를 활성화하여 노드가 자동으로 추가되도록 설정해야 합니다.

--nodes=1:5 <node-group> 옵션을 사용하여 최소 1개, 최대 5개의 노드를 자동 확장

 

2. HPA에 의해 Pod이 확장되었을 때, 노드가 자동으로 추가되는지 확인해야 합니다.

 


✅ Cluster Autoscaler 활성화 명령어

kubectl apply -f cluster-autoscaler.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: cluster-autoscaler
  namespace: kube-system
spec:
  replicas: 1
  selector:
    matchLabels:
      app: cluster-autoscaler
  template:
    metadata:
      labels:
        app: cluster-autoscaler
    spec:
      containers:
      - name: cluster-autoscaler
        image: k8s.gcr.io/autoscaling/cluster-autoscaler:v1.22.2
        command:
        - ./cluster-autoscaler
        - --cloud-provider=<CLOUD_PROVIDER>
        - --nodes=1:5:<NODE_GROUP>
        - --scale-down-enabled=true
        - --logtostderr=true
        - --v=4

 

 


📌 적용 후 예상 결과 값

 

1. HPA에 의해 Pod 개수 증가 확인

kubectl run --rm -it load-generator --image=busybox -- /bin/sh -c "while true; do wget -q -O- http://hpa-cluster-app; done"

 

💡 예상 출력 값

NAME              REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
hpa-cluster-app   Deployment/hpa-cluster-app   85%/50%   1         10        6         2m

 

2. 새로운 노드가 자동으로 추가되는지 확인

kubectl get nodes

 

💡 예상 출력 값

NAME                STATUS   ROLES    AGE   VERSION
worker-node-1       Ready    <none>   10m   v1.22.2
worker-node-2       Ready    <none>   1m    v1.22.2  # 자동 추가된 노드

 

3. Pod이 새로운 노드에서 실행되고 있는지 확인

kubectl get pods -o wide

 

💡 예상 출력 값

NAME                      READY   STATUS    NODE           AGE
hpa-cluster-app-xyz1      1/1     Running   worker-node-1  2m
hpa-cluster-app-abc2      1/1     Running   worker-node-1  1m
hpa-cluster-app-def3      1/1     Running   worker-node-2  20s  # 새 노드에서 실행됨

 

728x90