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 파라미터

파라미터기본값설명
initialDelaySeconds0첫 체크 전 대기 시간
periodSeconds10체크 간격
timeoutSeconds1타임아웃
failureThreshold3실패 허용 횟수
successThreshold1성공 판정 횟수 (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