쿠버네티스에서 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 # 새 노드에서 실행됨