공통 순서
① 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/memory | requests 합이 노드 여유를 넘는다 |
untolerated taint | 테인트를 견디지 못한다 |
didn't match Pod's node affinity/selector | 라벨 조건 불일치 |
didn't match pod anti-affinity rules | 같은 노드 회피 규칙 |
unbound immediate PersistentVolumeClaims | PVC 바인딩 대기 |
자원 부족이면 실제 장부를 본다
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이면 트래픽을 못 받는다.