kubectl get pods에서 STATUS가 계속 Pending이라면, 스케줄러가 이 Pod를 올릴 노드를 못 찾고 있다는 뜻입니다. 컨테이너는 아직 어떤 노드에도 배치되지 않았고, 조건을 만족하는 노드가 나타날 때까지 대기합니다. 원인은 거의 항상 "왜 어떤 노드도 못 받는가"에 있습니다.
1단계 — 스케줄러가 거절한 이유를 본다
kubectl describe pod <pod>
Events의 FailedScheduling 메시지가 정확한 이유를 알려줍니다.
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 / affinity | nodeSelector·affinity 조건 불일치 |
pod has unbound immediate PersistentVolumeClaims | PVC가 바인딩되지 않음 |
had volume node affinity conflict | PV가 묶인 노드와 스케줄 대상 불일치 |
원인별 해결
① 리소스 부족 (Insufficient cpu/memory) — Pod의 resources.requests가 노드 여유보다 큼. 노드 여유를 확인하고 requests를 낮추거나 노드를 늘립니다.
kubectl describe nodes | grep -A5 "Allocated resources"
② 테인트 (untolerated taint) — 노드에 테인트가 걸려 있는데 Pod에 toleration이 없는 경우(컨트롤플레인 노드가 대표적). 매니페스트에 toleration을 추가하거나 워커 노드로 보냅니다.
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 상태를 확인합니다.
kubectl get pvc # STATUS가 Pending이면 PV/StorageClass 문제
⑤ 노드 자체가 NotReady — 워커 노드가 Ready가 아니면 스케줄 대상에서 빠집니다. kubectl get nodes로 노드 상태부터 확인합니다.
체크리스트
kubectl describe pod <pod> # FailedScheduling 메시지
kubectl get nodes # Ready 노드 수
kubectl describe nodes | grep -A5 "Allocated resources"
kubectl get pvc # 볼륨 관련이면 PVC 상태
메시지 한 줄이 곧 원인입니다 — 추측 전에 Events를 먼저 봅니다.
리소스 requests와 테인트·toleration을 직접 조정하며 스케줄링 실패를 재현·해결하는 실습은 쿠버네티스 트랙에서 회원가입 없이 무료로 해볼 수 있습니다.