쿠버네티스 용어 사전
트러블슈팅Pending · CrashLoopBackOff · ImagePullBackOff · Terminating

파드 상태 진단

상태 이름이 곧 어느 단계에서 막혔는지를 말해 준다. describe의 Events가 답을 문장으로 준다.

공통 순서
  ① kubectl get pods -o wide          상태·재시작 횟수·노드
  ② kubectl describe pod <name>       Events 를 아래에서 위로 읽는다
  ③ kubectl logs <name> --previous    직전에 죽은 컨테이너 로그
  ④ kubectl get events --sort-by=.lastTimestamp -A | tail -30

Pending — 아직 노드에 배치되지 않았다

이벤트 문구원인
Insufficient cpu/memoryrequests 합이 노드 여유를 넘는다
untolerated taint테인트를 견디지 못한다
didn't match Pod's node affinity/selector라벨 조건 불일치
didn't match pod anti-affinity rules같은 노드 회피 규칙
unbound immediate PersistentVolumeClaimsPVC 바인딩 대기
자원 부족이면 실제 장부를 본다
  kubectl describe node <name> | grep -A8 'Allocated resources'

ImagePullBackOff · ErrImagePull

  • 이미지 이름·태그 오타 — 가장 흔하다

  • 프라이빗 레지스트리 인증 — imagePullSecrets 누락

  • 레지스트리 접근 불가 — 네트워크·프록시

  • rate limit — 익명 pull 제한

  • "pull access denied" 인가 "not found" 인가로 갈린다

CrashLoopBackOff — 뜨자마자 죽는다

BackOff 는 '재시작을 점점 늦추고 있다' 는 뜻이다 (최대 5분) 원인은 컨테이너가 계속 죽는 것이지 쿠버네티스가 아니다

  • kubectl logs <pod> --previous — ← 여기에 답이 있다
  • kubectl describe pod <pod> — ← Last State 의 Exit Code
Exit Code
  0     정상 종료인데 재시작됐다 → 커맨드가 바로 끝나는 것
        (foreground 로 돌아야 한다)
  1     애플리케이션 예외
  137   OOMKilled 또는 강제 종료
  127   명령을 못 찾음 (경로 · libc 불일치)
  126   실행 권한 없음

Running 인데 트래픽이 안 온다

READY 가 0/1 인지 본다

  • kubectl get pods
  • web-xxx 0/1 Running 0 ← readiness 실패

kubectl describe pod | grep -A3 Readiness

  • Readiness probe failed: HTTP probe failed with statuscode: 500

  • 엔드포인트에 안 들어간다 → 서비스가 트래픽을 안 보낸다

Terminating 에서 안 사라진다

  • 유예 시간을 기다리는 중 (정상)
  • PID 1 이 SIGTERM 을 무시한다 → 유예 시간을 꽉 채운다
  • preStop 훅이 안 끝난다
  • finalizer 가 남아 있다 ← 이건 영원히 안 사라진다
kubectl get pod <name> -o jsonpath='{.metadata.finalizers}'

finalizer 는 '지우기 전에 할 일' 을 등록한 것이다 그 컨트롤러가 죽었으면 아무도 지워 주지 않는다

--force --grace-period=0 을 습관적으로 쓰지 않는다. StatefulSet 에서는 같은 이름의 파드가 두 개 도는 상태를 만들어 볼륨 손상으로 이어진다.

이벤트가 사라지기 전에 본다

이벤트는 기본적으로 1시간만 보관된다
  → 지난 장애를 조사하려면 로그·이벤트를 외부로 수집해 둬야 한다
  → "이벤트가 없어서 원인을 못 찾았다" 는 수집 체계의 문제다

kubectl get events -A --sort-by=.lastTimestamp | tail -40
kubectl get events --field-selector involvedObject.name=web-xxx

여러 파드를 한꺼번에 보기

kubectl logs -l app=web --tail=100 --prefix -f
kubectl get pods -l app=web -o wide --watch
kubectl describe pods -l app=web | grep -E 'Name:|Status:|Reason:'

--prefix 를 붙이면 어느 파드의 로그인지 표시된다 특정 파드만 문제인지 전부인지를 가르는 것이 진단의 첫 갈림길이다

  • 전부면 — 설정·의존 자원 문제
  • 하나만 — 그 노드나 그 파드의 문제

면접 함정

  • "CrashLoopBackOff는 쿠버네티스 문제" → 컨테이너가 계속 죽는 것이다. 로그를 본다.
  • "Running이면 정상" → READY가 0/1이면 트래픽을 못 받는다.

함께 보면 좋은 용어

노트에서 맥락과 함께 보기 — 트러블슈팅 — 증상에서 원인으로