← 아티클 목록

Pod가 Pending에서 안 넘어갈 때 — 스케줄링 실패 원인과 해결

2026-07-20#kubernetes#트러블슈팅#스케줄링

kubectl get pods에서 STATUS가 계속 Pending이라면, 스케줄러가 이 Pod를 올릴 노드를 못 찾고 있다는 뜻입니다. 컨테이너는 아직 어떤 노드에도 배치되지 않았고, 조건을 만족하는 노드가 나타날 때까지 대기합니다. 원인은 거의 항상 "왜 어떤 노드도 못 받는가"에 있습니다.

1단계 — 스케줄러가 거절한 이유를 본다

Kubernetes
kubectl describe pod <pod>

Events의 FailedScheduling 메시지가 정확한 이유를 알려줍니다.

OUTPUT
0/3 nodes are available:
  3 Insufficient cpu,
  1 node(s) had untolerated taint {node-role.kubernetes.io/control-plane}.

2단계 — 메시지로 원인 좁히기

FailedScheduling 메시지원인
Insufficient cpu / Insufficient memory노드 가용 리소스 < requests
had untolerated taint노드 테인트에 맞는 toleration 없음
didn't match node selector / affinitynodeSelector·affinity 조건 불일치
pod has unbound immediate PersistentVolumeClaimsPVC가 바인딩되지 않음
had volume node affinity conflictPV가 묶인 노드와 스케줄 대상 불일치

원인별 해결

① 리소스 부족 (Insufficient cpu/memory) — Pod의 resources.requests가 노드 여유보다 큼. 노드 여유를 확인하고 requests를 낮추거나 노드를 늘립니다.

Kubernetes
kubectl describe nodes | grep -A5 "Allocated resources"

② 테인트 (untolerated taint) — 노드에 테인트가 걸려 있는데 Pod에 toleration이 없는 경우(컨트롤플레인 노드가 대표적). 매니페스트에 toleration을 추가하거나 워커 노드로 보냅니다.

Kubernetes
kubectl get nodes -o custom-columns=NAME:.metadata.name,TAINTS:.spec.taints

③ nodeSelector / affinity 불일치 — 라벨 조건에 맞는 노드가 없음. kubectl get nodes --show-labels로 라벨을 확인하고 조건을 맞춥니다.

④ PVC 미바인딩 (unbound PVC) — 요청한 StorageClass에 바인딩 가능한 PV가 없음. PVC 상태를 확인합니다.

Kubernetes
kubectl get pvc          # STATUS가 Pending이면 PV/StorageClass 문제

⑤ 노드 자체가 NotReady — 워커 노드가 Ready가 아니면 스케줄 대상에서 빠집니다. kubectl get nodes로 노드 상태부터 확인합니다.

체크리스트

Kubernetes
kubectl describe pod <pod>      # FailedScheduling 메시지
kubectl get nodes               # Ready 노드 수
kubectl describe nodes | grep -A5 "Allocated resources"
kubectl get pvc                 # 볼륨 관련이면 PVC 상태

메시지 한 줄이 곧 원인입니다 — 추측 전에 Events를 먼저 봅니다.


리소스 requests와 테인트·toleration을 직접 조정하며 스케줄링 실패를 재현·해결하는 실습은 쿠버네티스 트랙에서 회원가입 없이 무료로 해볼 수 있습니다.