이 글은 제가 기존에 공부하고 정리했던 pod 의 생명주기 관련 문서를
claude 를 통해서 재정리한 글입니다. 그래서 약간 AI 스러운 말투가 있음을
알아주시기 바랍니다.
Kubernetes를 공부하다 보면 Pod의 상태가
Pending, Running, CrashLoopBackOff 등 다양하게 표시되는 것을 볼 수 있습니다.
이 상태들이 정확히 무엇을 의미하는지, 어떤 순서로 전환되는지 정리해보겠습니다.
먼저 혼동하기 쉬운 개념을 구분해봅시다.
Pod Phase (공식 5가지)
PendingRunningSucceededFailedUnknownContainer State / Reason (kubectl에서 보이는 추가 상태)
ContainerCreatingImagePullBackOffCrashLoopBackOffErrImagePullkubectl get pods 명령어의 STATUS 컬럼에는 Pod Phase뿐만 아니라
Container State도 함께 표시됩니다. 그래서 실제로는 5개보다 훨씬 많은
상태를 보게 되는 거죠.
kubectl run some-app --image=nginx ...
│
▼
┌─────────┐
│ Pending │ ← 스케줄링 대기 (Node 찾는 중)
└────┬────┘
│
▼
┌─────────────────────┐
│ Pending + │ ← Node 배정 완료
│ ContainerCreating │ 컨테이너 생성 중
└──────┬──────────────┘
│
├─→ ImagePullBackOff (이미지 다운로드 실패)
│
▼
┌──────────┐
│ Running │ ← 컨테이너 실행 중
└─────┬────┘
│
├─→ Succeeded (exit 0, 정상 종료)
│ │
│ └─→ (restartPolicy: Always면 재시작 → CrashLoopBackOff 가능)
│
└─→ Failed (exit != 0, 비정상 종료)
│
└─→ CrashLoopBackOff (주로 여기서 발생!)
Pod가 생성되었지만 아직 실행되지 않은 상태입니다.
주요 원인:
확인 방법:
kubectl describe pod <pod-name>
# Events 섹션에서 원인 확인 가능
스케줄링은 완료되었고, 컨테이너를 생성하는 중입니다.
이때 실제 Pod Phase는 여전히 Pending일 수 있습니다.
이 단계에서 하는 일:
컨테이너 이미지를 다운로드하는데 실패한 상태입니다.
주요 원인:
해결 방법:
# 이미지 이름 확인
kubectl describe pod <pod-name>
# Events에서 에러 메시지 확인
# "Failed to pull image" 메시지 찾기
컨테이너가 성공적으로 생성되어 실행 중인 상태입니다.
Pod가 Running 상태여도 앱이 정상이 아닐 수 있습니다!
컨테이너가 실행되고 exit code 0으로 정상 종료된 상태입니다.
언제 보나요?
일반 Pod (Deployment 등)에서는?
# Job 예시
apiVersion: batch/v1
kind: Job
metadata:
name: data-backup
spec:
template:
spec:
restartPolicy: Never
containers:
- name: backup
image: backup-tool
command: ["./backup.sh"]
# backup.sh가 성공하면 → Succeeded
컨테이너가 exit code != 0으로 비정상 종료된 상태입니다.
모든 종류의 Pod에서 발생 가능합니다!
Deployment의 Pod:
Running → Failed (앱 crash!)
↓
Running (restartPolicy: Always라서 즉시 재시작)
↓
Failed (또 crash)
↓
CrashLoopBackOff (반복...)
Job의 Pod:
Running → Failed
↓
- restartPolicy: Never → Failed 상태 유지
- restartPolicy: OnFailure → 재시도
일반 Pod (restartPolicy: Never):
Running → Failed
↓
(그대로 Failed 상태 유지)
재시작 여부는 restartPolicy에 따라 결정됩니다.
컨테이너가 시작되자마자 계속 종료되는 상태입니다.
발생 조건:
언제 발생하나요?
주로 Failed (exit != 0) 상황에서 발생 (99%)
restartPolicy에 따라 재시작드물게 Succeeded (exit 0)에서도 발생 가능
apiVersion: v1
kind: Pod
metadata:
name: wrong-design
spec:
restartPolicy: Always # 잘못된 설정!
containers:
- name: batch
image: busybox
command: ["sh", "-c", "echo Done && exit 0"]
위 예시는 1회성 작업인데 restartPolicy: Always로 설정한 경우입니다.
하지만 이건 설계 실수입니다! 1회성 작업은 Job으로 만들거나 restartPolicy: Never를 써야 합니다.
주요 원인 (실무에서):
디버깅 방법:
# 로그 확인
kubectl logs <pod-name>
# 이전 컨테이너 로그 확인 (재시작된 경우)
kubectl logs <pod-name> --previous
# 상세 정보
kubectl describe pod <pod-name>
Pod의 spec.restartPolicy로 컨테이너가 종료됐을 때 어떻게 할지 결정합니다.
3가지 옵션:
Always (기본값)
OnFailure
Never
apiVersion: v1
kind: Pod
metadata:
name: my-app
spec:
restartPolicy: Always # 기본값
containers:
- name: app
image: nginx
주의: 재시작 횟수는 지정할 수 없습니다. Kubernetes가 백오프 알고리즘으로 자동 조절합니다.
# 모든 Pod 상태 확인
kubectl get pods
# 특정 Pod 상세 정보
kubectl describe pod <pod-name>
# 실시간 상태 모니터링
kubectl get pods -w
kubectl get pods로 STATUS 확인kubectl describe pod로 Events 확인kubectl logs로 앱 로그 확인kubectl logs --previous로 이전 로그 확인nginx:latset (latest 오타)Pod의 생명주기를 이해하면 Kubernetes 클러스터에서 발생하는 대부분의
문제를 빠르게 파악하고 해결할 수 있습니다.
특히 Pending, ImagePullBackOff, CrashLoopBackOff 같은 상태들은 각각
다른 원인을 가지고 있으므로, STATUS를 보는 순간 "아, 이건 이미지 문제구나",
"리소스가 부족하구나" 하고 바로 파악할 수 있게 됩니다.
참고 문서: