Deployment의 replicas를 늘렸는데 새 Pod이 계속 Pending 상태에 머문 경험이 있나요. 노드의 CPU·메모리가 부족해 더는 Pod을 받을 수 없을 때 벌어지는 일입니다. Cluster Autoscaler는 바로 이 순간 노드 자체를 자동으로 늘려, 갈 곳 없던 Pod이 스케줄될 자리를 만들어 줍니다. 반대로 노드가 한가해지면 줄여 비용을 아낍니다.
Cluster Autoscaler가 보는 것
Cluster Autoscaler는 Pod이 아니라 스케줄되지 못한 Pod과 노드의 여유를 봅니다. 클라우드의 노드 그룹(AWS의 ASG, GKE의 노드 풀 등)과 연동해 노드 수를 직접 조정합니다.
| 구분 | 대상 | 신호 |
|---|---|---|
| Cluster Autoscaler | 노드 수 | Pending Pod, 노드 유휴 |
| HPA | Pod 수(replicas) | CPU·메모리·커스텀 지표 |
| VPA | Pod 자원 요청량 | 실제 사용량 추세 |
HPA가 "Pod을 몇 개 띄울지"를 정한다면, Cluster Autoscaler는 "그 Pod들을 담을 노드가 충분한지"를 책임집니다. 둘은 경쟁이 아니라 위아래로 짝을 이루는 관계입니다.
확장과 축소의 흐름
확장(scale-up)은 단순합니다. Scheduler가 어떤 Pod을 어느 노드에도 배치하지 못하면 그 Pod은 Pending이 됩니다. Cluster Autoscaler는 이를 감지하고, "노드를 한 대 더 추가하면 이 Pod이 들어갈 수 있는가"를 모의 계산한 뒤 노드 그룹에 노드 추가를 요청합니다.
kubectl get pods --field-selector status.phase=Pending
kubectl describe pod my-app-xxxx | grep -A5 Events
Events에 0/3 nodes are available: Insufficient cpu 같은 메시지가 보이면 확장 트리거입니다.
축소(scale-down)는 더 신중합니다. 어떤 노드의 사용률이 일정 기간(--scale-down-utilization-threshold, 기본 50%) 아래로 떨어지고, 그 노드의 Pod들을 다른 노드로 옮길 수 있어야만 노드를 비우고 제거합니다.
# 이 Pod은 축소 시 함부로 못 옮긴다는 표시
metadata:
annotations:
"cluster-autoscaler.kubernetes.io/safe-to-evict": "false"
자주 막히는 지점
확장이 안 될 때 가장 흔한 원인은 노드 그룹의 maxSize 상한입니다. 이미 최대치면 Cluster Autoscaler도 더는 노드를 못 늘립니다. 또한 Pod에 resources.requests가 없으면 스케줄러가 빈 노드로 착각해 확장 판단이 어긋날 수 있으니, requests는 반드시 명시합니다.
요점 정리
- Cluster Autoscaler는
PendingPod을 신호로 노드를 자동으로 늘린다. - 노드가 한가해지고 Pod 이전이 가능하면 노드를 줄여 비용을 아낀다.
- HPA(Pod 수)와 Cluster Autoscaler(노드 수)는 위아래로 짝을 이룬다.
- 확장이 막히면 노드 그룹
maxSize와 Pod의resources.requests를 먼저 확인한다.
Pending Pod이 노드 확장으로 풀리는 과정을 직접 만들며 확인하는 실습은 쿠버네티스 트랙에서 할 수 있습니다 — 회원가입 없이 무료로.