Pod 생명주기
Kubernetes Pod의 생성부터 종료까지 전체 생명주기 완벽 가이드
Kubernetes Pod의 생성부터 종료까지 전체 생명주기 완벽 가이드
목표: Pod 상태를 읽고, 문제를 진단할 수 있는 수준
🔄 Pod 생명주기 다이어그램
[Pending]
│
│ (이미지 풀, 볼륨 마운트)
▼
[ContainerCreating]
│
│ (컨테이너 실행)
▼
[Running]
│
├──┬──┬──┬──┐
│ │ │ │ │
▼ ▼ ▼ ▼ ▼
[Succeeded] [Failed] [Unknown] [Terminating] [CrashLoopBackOff]
│ │ │ │ │
│ │ │ │ │
▼ ▼ ▼ ▼ ▼
[종료] [종료] [상실] [삭제중] [재시작]
📊 Pod 상태 (Phase)
| 상태 | 설명 | 흔한 원인 |
|---|---|---|
| Pending | 승인됨, 실행 준비 중 | 이미지 풀 중, 스케줄링 중, 볼륨 마운트 중 |
| Running | 실행 중 | 정상 상태 |
| Succeeded | 성공적으로 완료 | Job, Init Container |
| Failed | 실패 | 컨테이너 종료 코드 ≠ 0 |
| Unknown | 상태 불명 | 노드 통신 단절 |
# Pod 상태 확인
kubectl get pods
kubectl get pod my-pod -o yaml | grep phase
# 상세 상태
kubectl describe pod my-pod
🔍 컨테이너 상태 (Container State)
| 상태 | 설명 |
|---|---|
| Waiting | 실행 대기 중 (이유: ContainerCreating, CrashLoopBackOff 등) |
| Running | 실행 중 (startedAt 시간) |
| Terminated | 종료됨 (exitCode, reason, finishedAt) |
# 컨테이너 상태 확인
kubectl get pod my-pod -o jsonpath='{.status.containerStatuses[0].state}'
# 종료 코드 확인
kubectl get pod my-pod -o jsonpath='{.status.containerStatuses[0].lastState.terminated.exitCode}'
⚡ Init Container
역할: 메인 컨테이너 실행 전 초기화 작업 수행.
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
spec:
initContainers:
- name: init-myservice
image: busybox:1.28
command: ['sh', '-c', 'until nslookup myservice; do echo waiting; sleep 2; done']
- name: init-mydb
image: busybox:1.28
command: ['sh', '-c', 'until nslookup mydb; do echo waiting; sleep 2; done']
containers:
- name: myapp-container
image: busybox:1.28
command: ['sh', '-c', 'echo App started!']
특징:
- 순차적 실행 (init-1 완료 → init-2 시작)
- 모두 성공해야 메인 컨테이너 실행
- 실패 시 Pod 재시작 (restartPolicy에 따라)
🏥 Probe (헬스체크)
Probe 종류
| Probe | 목적 | 실패 시 동작 |
|---|---|---|
| LivenessProbe | 살아있는지 확인 | 컨테이너 재시작 |
| ReadinessProbe | 요청 받을 준비 확인 | Service Endpoints에서 제외 |
| StartupProbe | 시작 완료 확인 | Liveness/Readiness 비활성화 |
Probe 설정 예시
apiVersion: v1
kind: Pod
metadata:
name: probe-demo
spec:
containers:
- name: app
image: nginx
ports:
- containerPort: 80
livenessProbe:
httpGet:
path: /healthz
port: 80
initialDelaySeconds: 10
periodSeconds: 5
timeoutSeconds: 3
failureThreshold: 3
readinessProbe:
httpGet:
path: /ready
port: 80
initialDelaySeconds: 5
periodSeconds: 3
successThreshold: 2
startupProbe:
httpGet:
path: /startup
port: 80
failureThreshold: 30
periodSeconds: 10
Probe 파라미터
| 파라미터 | 기본값 | 설명 |
|---|---|---|
initialDelaySeconds | 0 | 첫 체크 전 대기 시간 |
periodSeconds | 10 | 체크 간격 |
timeoutSeconds | 1 | 타임아웃 |
failureThreshold | 3 | 실패 허용 횟수 |
successThreshold | 1 | 성공 판정 횟수 (Readiness만) |
🔄 재시작 정책 (RestartPolicy)
| 정책 | 설명 | 사용처 |
|---|---|---|
| Always | 항상 재시작 (기본) | Deployment, DaemonSet |
| OnFailure | 실패 시만 재시작 | Job |
| Never | 재시작 안함 | 일회성 작업 |
🐛 일반적인 문제
CrashLoopBackOff
# 원인 파악
kubectl logs my-pod --previous
kubectl describe pod my-pod
# 흔한 원인:
# 1. 앱 시작 실패
# 2. 환경변수/설정 누락
# 3. 의존성 서비스 없음
# 4. 포트 충돌
ImagePullBackOff
# 원인 파악
kubectl describe pod my-pod | grep -i "failed to pull"
# 흔한 원인:
# 1. 이미지 이름/태그 오류
# 2. Private Registry 인증 실패
# 3. 네트워크 문제
Pending 상태
# 원인 파악
kubectl describe pod my-pod | grep -A 10 Events
# 흔한 원인:
# 1. 리소스 부족 (CPU/메모리)
# 2. 스케줄링 제약 (NodeSelector, Taint)
# 3. 볼륨 마운트 실패
# 4. 이미지 풀 중
📋 체크리스트
- Pod Phase 이해
- Container State 이해
- Init Container 사용
- Liveness/Readiness/Startup Probe 설정
- 재시작 정책 선택
- CrashLoopBackOff 해결
- ImagePullBackOff 해결
- Pending 상태 해결
🔗 관련 노트
- 01-01-K8s-아키텍처-이해 — 전체 구조
- 01-04-Deployment-관리 — 워크로드 관리
- 02-11-Pod-실패-원인-분석 — 트러블슈팅 심화
마지막 업데이트: 2026-06-01