본문 바로가기
DevOps/Kubernetes

[Kubernetes] Pod의 생명주기(Lifecycle)와 리스타트 정책(Restart Policy) 완벽 이해

by couque 2026. 3. 9.
반응형

쿠버네티스를 운영하다 보면 Pod가 Pending 상태에 머물러 있거나, CrashLoopBackOff 에러를 뱉으며 무한 재시작되는 경우를 자주 보게 됩니다. 오늘은 Pod가 태어나서 죽을 때까지 어떤 과정을 거치는지, 그리고 문제가 생겼을 때 어떻게 다시 살아나는지 결정하는 Restart Policy에 대해 알아보겠습니다.

 

이전 시간에 학습한 [Kubernetes] 쿠버네티스 Deployment 완벽 정리: 중단 없는 서비스 배포의 핵심 바로가기

 

1. Pod의 상태 흐름 (Pod Phase)

Pod는 생성부터 삭제까지 다섯 가지 단계(Phase)를 거칩니다.

  • Pending: 쿠버네티스 시스템에 Pod 생성 승인은 되었지만, 아직 컨테이너 이미지를 다운로드 중이거나 노드에 스케줄링되지 않은 상태입니다.
  • Running: Pod가 노드에 할당되었고, 모든 컨테이너가 생성되었습니다. 적어도 하나 이상의 컨테이너가 실행 중이거나 시작/재시작 중인 상태입니다.
  • Succeeded: Pod 내의 모든 컨테이너가 정상적으로 종료되었으며, 다시 재시작되지 않는 상태입니다. (주로 Batch 작업/Job에서 발생)
  • Failed: Pod 내의 모든 컨테이너가 종료되었으나, 적어도 하나 이상의 컨테이너가 실패(0이 아닌 종료 코드)로 종료된 상태입니다.
  • Unknown: 어떤 이유로 인해 Pod의 상태를 확인할 수 없는 상태입니다. (주로 노드 통신 문제)

2. Restart Policy (재시작 정책)

Pod가 종료되었을 때 쿠버네티스가 어떻게 대응할지를 결정합니다. spec.restartPolicy 필드에 설정합니다.

  • Always (기본값): 컨테이너가 종료되면 무조건 재시작합니다. 웹 서버 같은 서비스형 앱에 적합합니다.
  • OnFailure: 컨테이너가 에러(종료 코드 0이 아님)로 종료된 경우에만 재시작합니다.
  • Never: 어떤 경우에도 재시작하지 않습니다.

3. Hands-on: 에러 발생 시 재시작 동작 확인

의도적으로 에러를 발생시키는 Pod를 생성하여 Always와 OnFailure의 차이를 테스트해 보겠습니다.

테스트 1: Always 정책 (기본값)

YAML
 
apiVersion: v1
kind: Pod
metadata:
  name: pod-restart-always
spec:
  restartPolicy: Always
  containers:
  - name: busybox
    image: busybox
    args: [/bin/sh, -c, "sleep 10; exit 1"] # 10초 뒤 에러 종료

테스트 2: OnFailure 정책

YAML
 
apiVersion: v1
kind: Pod
metadata:
  name: pod-restart-onfailure
spec:
  restartPolicy: OnFailure
  containers:
  - name: busybox
    image: busybox
    args: [/bin/sh, -c, "sleep 10; exit 0"] # 10초 뒤 정상 종료

4. 테스트 결과 확인 (Test Results)

Bash
 
$ kubectl get pods -w

# Always 정책의 경우: 에러 종료 후 RESTARTS 횟수가 계속 올라감
NAME                 READY   STATUS    RESTARTS   AGE
pod-restart-always   1/1     Running   0          5s
pod-restart-always   0/1     Error     0          10s
pod-restart-always   1/1     Running   1          11s

# OnFailure 정책의 경우 (정상 종료 시):
pod-restart-onfailure   1/1     Running     0          5s
pod-restart-onfailure   0/1     Completed   0          10s # 재시작하지 않음

💡 Insight: 어떤 정책을 선택해야 할까?

Pod의 성격에 따라 정책은 명확히 갈려야 합니다.

  • 웹 서버, API 서버: 무조건 살아있어야 하므로 Always가 필수입니다.
  • 데이터 백업, 마이그레이션 스크립트: 성공하면 끝나야 하고 실패 시에만 다시 시도해야 하므로 OnFailure가 적합합니다.
  • 로그 수집(일회성): 결과와 상관없이 기록만 남기고 끝내야 한다면 Never를 고려하세요.

Pod의 생명주기를 이해하는 것은 단순히 상태를 보는 것을 넘어, 인프라의 자동 복구(Self-healing) 전략을 설계하는 첫걸음입니다.

반응형

댓글