← 아티클 목록

쿠버네티스 restartPolicy — Always·OnFailure·Never 차이

2028-12-04#kubernetes#restartpolicy#파드

Pod 안의 컨테이너가 죽었을 때 쿠버네티스가 그걸 다시 띄울지 말지는 restartPolicy가 결정합니다. 이 값을 잘못 이해하면 "한 번만 돌고 끝나야 할 Job이 무한히 재시작"하거나 "죽으면 살아나야 할 앱이 그냥 멈춰" 있습니다. 세 가지 값 Always, OnFailure, Never의 차이를 알면 워크로드 성격에 맞는 선택이 보입니다.

세 가지 값의 차이

restartPolicy는 Pod 단위 설정이고, Pod 안의 모든 컨테이너에 공통 적용됩니다. 컨테이너가 종료될 때 그 **종료 코드(exit code)**를 보고 다시 띄울지를 판단합니다. 종료 코드 0은 정상 종료, 0이 아니면 실패로 봅니다.

정상 종료(exit 0)실패 종료(exit != 0)
Always재시작재시작
OnFailure재시작 안 함재시작
Never재시작 안 함재시작 안 함

Always는 "끝나면 안 되는 것"용입니다. 웹 서버처럼 계속 떠 있어야 하는 앱은 정상 종료조차 비정상으로 취급해 다시 띄웁니다.

워크로드 종류와 기본값

리소스 종류마다 허용되는 값과 기본값이 다릅니다. 이게 헷갈리는 핵심 지점입니다.

리소스허용 값기본값
Deployment / DaemonSetAlways만Always
Job / CronJobOnFailure, NeverNever
단독 Pod세 값 모두Always

그래서 Deployment 안에 restartPolicy: Never를 적으면 검증 단계에서 거부됩니다. Job은 반대로 Always를 쓸 수 없습니다 — 한 번 성공하면 끝나야 하는데 Always면 영원히 안 끝나기 때문입니다.

예시로 확인하기

배치 작업을 하나 정의해 보겠습니다.

YAML
apiVersion: batch/v1
kind: Job
metadata:
  name: data-import
spec:
  backoffLimit: 4
  template:
    spec:
      restartPolicy: OnFailure
      containers:
        - name: importer
          image: busybox
          command: ["sh", "-c", "exit 1"]

이 Job은 컨테이너가 exit 1로 실패하므로 OnFailure에 따라 재시작됩니다. 단, 무한 반복은 아니고 backoffLimit: 4만큼만 재시도한 뒤 Job을 실패로 마킹합니다. 재시작 횟수는 RESTARTS 열에서 보입니다.

Kubernetes
kubectl get pods
kubectl describe pod data-import-xxxxx

Always가 반복 실패하면 쿠버네티스는 즉시가 아니라 점점 간격을 늘려(CrashLoopBackOff) 재시작합니다. RESTARTS가 계속 오르고 상태가 CrashLoopBackOff면 앱 자체가 시작 못 하는 신호입니다.

요점 정리

  • restartPolicy는 Pod 단위이며 종료 코드를 보고 재시작 여부를 정한다.
  • Always는 항상, OnFailure는 실패(exit != 0)일 때만, Never는 절대 재시작 안 한다.
  • Deployment는 Always만, Job은 OnFailure/Never만 허용된다.
  • 반복 실패 시 CrashLoopBackOff로 재시작 간격이 늘어난다.

Pod이 죽고 살아나는 과정을 직접 띄워 보며 확인하는 실습은 쿠버네티스 트랙에서 할 수 있습니다 — 회원가입 없이 무료로.