← 아티클 목록

쿠버네티스 Cluster Autoscaler — 노드 자동 확장 원리

2028-10-23#kubernetes#autoscaler#노드

Deployment의 replicas를 늘렸는데 새 Pod이 계속 Pending 상태에 머문 경험이 있나요. 노드의 CPU·메모리가 부족해 더는 Pod을 받을 수 없을 때 벌어지는 일입니다. Cluster Autoscaler는 바로 이 순간 노드 자체를 자동으로 늘려, 갈 곳 없던 Pod이 스케줄될 자리를 만들어 줍니다. 반대로 노드가 한가해지면 줄여 비용을 아낍니다.

Cluster Autoscaler가 보는 것

Cluster Autoscaler는 Pod이 아니라 스케줄되지 못한 Pod과 노드의 여유를 봅니다. 클라우드의 노드 그룹(AWS의 ASG, GKE의 노드 풀 등)과 연동해 노드 수를 직접 조정합니다.

구분대상신호
Cluster Autoscaler노드 수Pending Pod, 노드 유휴
HPAPod 수(replicas)CPU·메모리·커스텀 지표
VPAPod 자원 요청량실제 사용량 추세

HPA가 "Pod을 몇 개 띄울지"를 정한다면, Cluster Autoscaler는 "그 Pod들을 담을 노드가 충분한지"를 책임집니다. 둘은 경쟁이 아니라 위아래로 짝을 이루는 관계입니다.

확장과 축소의 흐름

확장(scale-up)은 단순합니다. Scheduler가 어떤 Pod을 어느 노드에도 배치하지 못하면 그 Pod은 Pending이 됩니다. Cluster Autoscaler는 이를 감지하고, "노드를 한 대 더 추가하면 이 Pod이 들어갈 수 있는가"를 모의 계산한 뒤 노드 그룹에 노드 추가를 요청합니다.

Kubernetes
kubectl get pods --field-selector status.phase=Pending
kubectl describe pod my-app-xxxx | grep -A5 Events

Events0/3 nodes are available: Insufficient cpu 같은 메시지가 보이면 확장 트리거입니다.

축소(scale-down)는 더 신중합니다. 어떤 노드의 사용률이 일정 기간(--scale-down-utilization-threshold, 기본 50%) 아래로 떨어지고, 그 노드의 Pod들을 다른 노드로 옮길 수 있어야만 노드를 비우고 제거합니다.

YAML
# 이 Pod은 축소 시 함부로 못 옮긴다는 표시
metadata:
  annotations:
    "cluster-autoscaler.kubernetes.io/safe-to-evict": "false"

자주 막히는 지점

확장이 안 될 때 가장 흔한 원인은 노드 그룹의 maxSize 상한입니다. 이미 최대치면 Cluster Autoscaler도 더는 노드를 못 늘립니다. 또한 Pod에 resources.requests가 없으면 스케줄러가 빈 노드로 착각해 확장 판단이 어긋날 수 있으니, requests는 반드시 명시합니다.

요점 정리

  • Cluster Autoscaler는 Pending Pod을 신호로 노드를 자동으로 늘린다.
  • 노드가 한가해지고 Pod 이전이 가능하면 노드를 줄여 비용을 아낀다.
  • HPA(Pod 수)와 Cluster Autoscaler(노드 수)는 위아래로 짝을 이룬다.
  • 확장이 막히면 노드 그룹 maxSize와 Pod의 resources.requests를 먼저 확인한다.

Pending Pod이 노드 확장으로 풀리는 과정을 직접 만들며 확인하는 실습은 쿠버네티스 트랙에서 할 수 있습니다 — 회원가입 없이 무료로.