Pending → Running → Succeeded 또는 Failedstatus.phase 필드 — Pod lifecycle의 상위 수준 요약 (5개 값)| Phase | 의미 |
|---|---|
Pending |
클러스터에 받아들여졌으나 컨테이너 준비 미완료 (스케줄 대기·이미지 pull 중) |
Running |
노드에 바인딩되고 모든 컨테이너 생성됨, 최소 하나가 실행/시작/재시작 중 |
Succeeded |
모든 컨테이너가 성공 종료(0), 재시작되지 않음 |
Failed |
모든 컨테이너 종료, 최소 하나가 실패로 종료 (non-zero exit 또는 시스템 종료) |
Unknown |
노드와 통신 실패로 상태를 알 수 없음 |
STATUS 컬럼과 혼동 주의
kubectl get pod의 STATUS는 사용자 직관용 표시 값 — CrashLoopBackOff, Terminating 등 phase에 없는 값도 등장Failed 또는 Succeeded 단말 phase로 전환 (static Pod·force delete 제외)Failed phase로 설정됨kubectl describe pod <name>으로 컨테이너별 상태·Reason 확인 가능| State | 의미 |
|---|---|
Waiting |
시작에 필요한 작업 진행 중 (이미지 pull, Secret 적용 등). Reason 필드 포함 |
Running |
정상 실행 중. postStart hook이 정의돼 있다면 이미 완료된 시점 |
Terminated |
실행 후 완료 또는 실패. exit code, 시작·종료 시각 포함. preStop hook이 있다면 종료 전 실행됨 |
Pod.spec.restartPolicy 필드 (기본값 Always)| 정책 | 종료 후 동작 |
|---|---|
Always |
exit code와 무관하게 항상 재시작 |
OnFailure |
non-zero exit일 때만 재시작 |
Never |
어떤 경우에도 재시작 안 함 |
initContainers 항목 중 자체 restartPolicy: Always를 가진 컨테이너. Pod-level 정책 무시Always (유일하게 허용되는 값)OnFailure 또는 Never10s, 20s, 40s, … 최대 300s(5분)에서 캡kubectl logs <pod>로 로그, kubectl describe pod <pod>로 이벤트·리소스 확인status.conditions 배열 — Pod이 거쳐온(또는 거치지 못한) 단계들. kubelet이 관리type / status(True·False·Unknown) / reason / message / lastTransitionTime 필드를 가짐| Condition | 의미 |
|---|---|
PodScheduled |
Pod이 노드에 스케줄됨 |
PodReadyToStartContainers |
샌드박스 생성·네트워크 구성·볼륨 마운트 완료 — 컨테이너 실행 직전 단계 |
Initialized |
모든 init container가 성공 종료 |
ContainersReady |
Pod 안의 모든 컨테이너가 ready 상태 |
Ready |
Pod이 요청을 받을 수 있음 — 매칭되는 Service의 EndpointSlice에 포함됨 |
DisruptionTarget |
preemption·eviction·GC 등으로 곧 종료될 예정 |
PodScheduled → PodReadyToStartContainers → Initialized → ContainersReady → ReadyReady는 ContainersReady + 모든 readiness gate 조건 충족의 결과 (gate 없으면 ContainersReady와 같음)spec.readinessGates에 커스텀 condition 정의spec:
readinessGates:
- conditionType: "www.example.com/feature-1" # status.conditions에 이 type이 True여야 Ready
kubectl patch로는 status 변경 불가. operator/앱이 PATCH API로 status.conditions에 직접 setTrue| 메커니즘 | 동작 | 성공 조건 |
|---|---|---|
exec |
컨테이너 안에서 명령 실행 | exit code 0 |
grpc |
gRPC health check (grpc.health.v1.Health) |
응답 status가 SERVING |
httpGet |
Pod IP의 지정 포트·경로로 HTTP GET | status code 200 ~ 399 |
tcpSocket |
Pod IP의 지정 포트로 TCP 연결 시도 | 포트가 열려 있음 |
exec은 매번 프로세스 fork — Pod 밀집도 높은 노드·짧은 periodSeconds에서 CPU 부하. 다른 방식 우선 고려Success / Failure / Unknown 세 가지 (Unknown은 kubelet이 재시도)| 종류 | 용도 | 실패 시 동작 |
|---|---|---|
livenessProbe |
컨테이너가 살아있는지 | 컨테이너 kill → restartPolicy 따라 재시작 |
readinessProbe |
트래픽을 받을 준비가 됐는지 | Pod IP를 모든 매칭 Service의 EndpointSlice에서 제거 (트래픽 차단) |
startupProbe |
초기 부팅이 완료됐는지 | 컨테이너 kill → restartPolicy 따라 재시작 |
Success (단 readinessProbe는 초기 delay 전엔 Failure)startupProbe가 정의되면 — 성공할 때까지 liveness/readiness probe는 비활성 → 부팅이 긴 앱이 liveness 실패로 죽는 걸 방지livenessProbe — 앱이 데드락 등으로 스스로 죽지 못할 때 필요. 앱이 알아서 crash로 종료한다면 restartPolicy만으로 충분readinessProbe — 트래픽 받을 준비를 별도 검증할 때. liveness와 다른 endpoint로 분리하면 self-drain(점검 모드) 가능startupProbe — 초기 로딩이 긴 앱(큰 데이터, migration 등). liveness의 initialDelaySeconds를 키우는 대신 분리하면 운영 단순화Pod.spec.terminationGracePeriodSeconds로 변경 가능SIGTERM (이미지의 STOPSIGNAL 지시어로 override 가능)kubectl delete pod 또는 controller에 의한 교체 시 진행되는 단계
kubectl get에 Terminating 표시
ready: false 로 변경 → 신규 트래픽 차단preStop hook이 정의돼 있으면 컨테이너 안에서 먼저 실행SIGTERM 전송 — container runtime이 컨테이너 PID 1에 시그널 전달
SIGKILL. 단말 phase(Failed/Succeeded) 전환 후 API에서 Pod 제거preStop hook이 grace period보다 길어지면 — 2초 grace extension만 추가됨. 그래도 부족하면 terminationGracePeriodSeconds를 늘려야 함kubectl delete pod <name> --grace-period=0 --force — graceful 단계 생략하고 즉시 삭제initContainers 중 restartPolicy: Always)가 있으면 — 메인 컨테이너가 모두 종료된 후에야 kubelet이 sidecar에 TERM 전송preStop hook으로 종료 순서를 제어하던 패턴은 sidecar로 대체 가능Succeeded/Failed) Pod 수가 임계값(terminated-pod-gc-threshold) 초과 시node.kubernetes.io/out-of-service taint가 붙은 not-ready 노드의 PodFailed로 마킹한 뒤 삭제