Kubernetes Pod 가 Pending 상태에 오래 머문다면 질문은 아주 단순합니다. 왜 scheduler 또는 runtime 이 이 pod 를 다음 단계로 못 넘기고 있는가입니다. 대개는 “Kubernetes 가 이상하다” 보다는 resource request, node matching, taint/toleration, storage binding, image/setup 지연 같은 몇 가지 범주로 정리됩니다.
짧게 말하면 핵심은 이것입니다. 추측보다 pod event 를 먼저 봐야 합니다. Pending 은 보통 애플리케이션 문제보다 placement 또는 pre-run 문제입니다.
추측보다 scheduling event 부터 본다
Pending 은 이 workload 가 “선언된 상태” 에서 “배치된 상태” 로 아직 못 넘어갔다는 뜻인 경우가 많습니다.
그래서 처음엔 app log 보다 아래 신호가 더 중요합니다.
- pod event
- node condition
- requests / limits
- affinity / selector
- PVC / storage binding
이걸 건너뛰고 deployment tuning 으로 가면 보통 시간이 오래 걸립니다.
Pending 은 실전에서 보통 무엇을 뜻하나
운영 환경에선 대개 이런 경우가 많습니다.
- 어떤 node 도 resource request 를 수용하지 못한다
- selector 나 affinity rule 이 placement 를 너무 좁힌다
- taint 가 scheduling 을 막는다
- storage 가 아직 준비되지 않았거나 bind 되지 않는다
- 완전한 unschedulable 은 아니지만 setup 을 기다리는 중이다
대시보드에서는 비슷해 보여도 event 를 보면 대개 빨리 구분됩니다.
흔한 원인
1. request 가 cluster capacity 와 맞지 않는다
CPU 또는 memory request 가 현재 사용 가능한 node 어디에도 들어가지 않을 수 있습니다.
traffic 증가 뒤나 oversized default 가 들어간 뒤 자주 보이는 패턴입니다.
2. node selector, affinity, taint 가 placement 를 막는다
스케줄링 규칙이 eligible node 를 필요 이상으로 줄일 수 있습니다.
예를 들면:
- 너무 엄격한 node selector
- 너무 적은 node 와만 맞는 affinity
- tainted pool 에 대한 toleration 누락
즉 cluster 전체 capacity 는 있어도, 그 규칙을 만족하는 capacity 가 없는 경우입니다.
3. PVC 또는 storage requirement 가 준비되지 않았다
pod 는 아래를 기다리며 멈출 수 있습니다.
- volume binding
- storage class 동작
- attachment timing
- 준비되지 않은 backing storage
event 에 volume binding 이나 unbound claim 이 보이면 이쪽 가능성이 큽니다.
4. image pull 또는 setup work 가 지연된다
일부 pod 는 image 나 runtime prerequisite 를 준비하는 동안 Pending 처럼 보이기도 합니다.
이럴 때는 scheduling 과 startup 경계가 흐려지기 때문에 event 문구가 특히 중요합니다.
5. requests / limits 가 해석하기 어렵게 짜여 있다
명백한 실패 하나보다, 시간이 지나며 비현실적이 된 resource model 이 문제일 수도 있습니다.
서류상으론 들어가 보이는 pod 도 실제 cluster 조건에서는 매우 배치하기 어려울 수 있습니다.
실전 점검 순서
1. kubectl describe pod event 를 본다
거의 항상 가장 빠른 첫 단계입니다.
주로 볼 단어는:
- unschedulable
- insufficient CPU
- insufficient memory
- volume binding delay
- taint mismatch
2. requests / limits 와 node capacity 를 비교한다
현재 resource pressure 를 감안했을 때 이 pod 를 실제로 수용할 node 가 있는지 보세요.
3. selector, affinity, taint, toleration 을 점검한다
cluster 전체는 멀쩡해 보여도, pod 스스로 placement 범위를 지나치게 좁혔을 수 있습니다.
4. PVC 와 storage binding 상태를 확인한다
storage 쪽이 준비되지 않으면 scheduling 이 괜찮아 보여도 pod 는 앞으로 나가지 못합니다.
5. 진짜 unschedulable 인지 setup 대기인지 구분한다
이 구분이 중요합니다. 이후 디버깅 경로가 완전히 달라지기 때문입니다.
node 에 올라간 뒤 실패한다면 더 이상 순수한 Pending 문제는 아닙니다.
빠른 명령
kubectl describe pod <pod> -n <ns>
kubectl get nodes
kubectl get pvc -n <ns>
scheduler placement 문제인지, node capacity 문제인지, storage wait 인지 먼저 가르는 기본 조합입니다.
unschedulable event, taint 또는 affinity mismatch, 아직 bind 되지 않은 PVC 를 먼저 확인해 보세요.
blocker 를 찾은 뒤 무엇을 바꾸면 좋나
request 가 너무 크다면
현실적인 node capacity 에 맞게 조정해야 합니다.
affinity 나 taint 규칙이 너무 빡빡하다면
placement rule 을 완화하거나 실제 필요한 toleration 을 추가해야 합니다.
PVC binding 이 문제라면
deployment 보다 claim, storage class, provisioning 동작을 먼저 고쳐야 합니다.
image 또는 runtime setup 이 지연된다면
scheduling 보다 image/startup 경로를 봐야 합니다.
workload 가 어디에도 겨우 들어가는 수준이라면
이건 일회성 장애보다 resource sizing 설계 문제로 보는 편이 맞습니다.
장애 중에 던져볼 질문
이 질문이 꽤 유용합니다.
Kubernetes 가 이 pod 를 배치하거나 시작하기 전에 반드시 만족돼야 할 정확한 조건은 무엇이고, 어떤 event 가 그 조건이 아직 안 맞는다고 말해 주는가?
이 질문이 generic 한 cluster 점검보다 훨씬 빨리 범위를 좁혀 줍니다.
FAQ
Q. Pending 이면 무조건 node 가 부족한 건가
아닙니다. scheduling constraint, storage wait, pre-run blocker 일 수도 있습니다.
Q. 가장 빠른 첫 단계는 무엇인가
kubectl describe pod 의 event 를 읽는 것입니다.
Q. Pending 인데 app log 를 먼저 봐야 하나
보통은 아닙니다. 컨테이너가 아직 시작도 못 했다면 scheduling/setup 신호가 더 중요합니다.
Q. storage 때문에도 Pending 이 오래 갈 수 있나
그렇습니다. unbound claim 과 volume binding 이 흔한 원인입니다.
Read Next
- pod 가 스케줄된 뒤 계속 restart 한다면 Kubernetes CrashLoopBackOff 를 이어서 보세요.
- root issue 가 container image 나 startup command 라면 Kubernetes ImagePullBackOff 와 비교해 보세요.
- 전체 인프라 글 흐름은 Infra 카테고리 에서 이어 볼 수 있습니다.
Related Posts
- Kubernetes CrashLoopBackOff
- Kubernetes ImagePullBackOff
- Kubernetes Service Has No Endpoints
- Infra 카테고리
Sources:
- https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/
- https://kubernetes.io/docs/concepts/scheduling-eviction/
심사 대기 중에는 광고 대신 관련 가이드를 먼저 보여줍니다.
먼저 읽어볼 가이드
검색 유입이 많은 핵심 글부터 이어서 보세요.
- 미들웨어 트러블슈팅 가이드: Redis vs RabbitMQ vs Kafka 개발자를 위한 미들웨어 트러블슈팅 허브 글입니다. Redis, RabbitMQ, Kafka 중 어떤 증상부터 먼저 봐야 하는지와 어떤 문제 패턴이 각 시스템에 가까운지 정리합니다.
- Kubernetes CrashLoopBackOff: 먼저 볼 것들 startup failure, probe, config, resource limit 관점에서 CrashLoopBackOff를 어떻게 나눠서 봐야 하는지 정리한 가이드입니다.
- Kafka consumer lag가 계속 늘 때: 트러블슈팅 가이드 Kafka consumer lag가 계속 늘어날 때 무엇부터 봐야 하는지 정리합니다. poll 주기, 처리 속도, rebalance, consumer 설정까지 실전 기준으로 다룹니다.
- Kafka Rebalancing Too Often 가이드 Kafka consumer group에서 rebalance가 너무 자주 일어날 때 membership flapping, poll timing, protocol, assignment churn을 어떤 순서로 봐야 하는지 설명하는 실전 가이드입니다.
- Docker container가 계속 재시작될 때: 먼저 확인할 것들 exit code, command failure, environment mistake, health check 관점에서 Docker restart loop를 푸는 실전 가이드입니다.
심사 대기 중에는 광고 대신 관련 가이드를 먼저 보여줍니다.