OPS

DevOps 스터디 - 애플리케이션 배포를 위한 고급 설정 #2

찻잔속청개구리 2025. 6. 15. 04:39
반응형

쿠버네티스 Pod 재시작 정책(restartPolicy), 어떻게 동작할까?

 

운영하다 컨테이너가 왜 자꾸 재시작되는지, 반대로 왜 한 번 죽고 나서 끝나는지 궁금할 때가 많았다. 

이럴 때 확인해야할 설정이 restartPolicy 이다.

쿠버네티스에서 restartPolicy는 "컨테이너가 종료되었을 때 kubelet이 재시작할지 말지"를 결정하는 정책인데, 

Pod 단위로 설정하며, 그 안에 있는 모든 컨테이너에 동일하게 적용된다.

 

 

restartPolicy는 Pod 스펙에서 spec.restartPolicy 필드로 설정한다.

apiVersion: v1
kind: Pod
metadata:
  name: example-pod
spec:
  restartPolicy: OnFailure
  containers:
    - name: my-container
      image: my-image
  • restartPolicy의 기본값은 Always이다. 직접 kubectl run으로 생성한 Pod는 따로 명시하지 않는 한 Always 이고, Deployment, StatefulSet처럼 컨트롤러가 관리하는 Pod는 무조건 Always로 설정된다.

 

restartPolicy 값별 동작을 세부적으로 정리해봤다.
의미 특징
Always 무조건 재시작 (정상/비정상 상관없음) 컨트롤러가 관리하는 Pod에서 기본
OnFailure 비정상 종료(Exit ≠ 0)일 때만 재시작 배치 작업에서 자주 사용
Never 종료되면 그대로 끝 (재시작 X) Job이나 실험용 Pod에서 사용

 

Always – 무한 재시작 모드

  • Always는 정상 종료든 비정상이든 컨테이너가 죽기만 하면 무조건 재시작한다.
  • 그러다가 컨테이너가 반복 실패하면 CrashLoopBackOff 상태로 빠진다.
  • Pod는 Succeeded, Failed로 바뀌지 않고 계속 Running 상태 유지하고 있다.

OnFailure – 실패할 때만 다시 도전

  • Exit code = 0 이 아닐 때만 kubelet이 재시작 시도한다.
  • Exit code = 0이면 바로 Succeeded로 전이된다.
  • OnFailure 역시 실패가 반복되면 CrashLoopBackOff 상태로 빠지게 되고, Pod는 여전히 Running 이다.

Never – 단발성 Pod에 적합

  • 컨테이너가 죽어도 그게 정상인지 비정상인지 상관없이 재시작하지 않는다.
  • Exit code 0 → Succeeded, Exit code ≠ 0 → Failed로 종료
  • 운영 서비스에는 적합하지 않고, Job이나 수동 테스트용으로 사용하는 것이 좋다.

예외 - init Container*는 예외

  • init Container는 restartPolicy와 무관하게 성공할 때까지 무조건 반복 실행된다
  • 즉, restartPolicy: Never로 설정해도 init 컨테이너는 계속 재시도한다는 것이다.
  • 모든 init 컨테이너가 성공(exit 0)해야 일반 컨테이너 실행으로 넘어간다.

*init Container: 애플리케이션이 실행되기 전에 필요한 초기화 작업을 담당하며, 앞 단계 init Container가 성공해야 다음 단계로 넘어간다. 작업이 끝나면 자동 종료되며, 일반 컨테이너처럼 계속 유지되지 않는 특징이 있다.

Pod Phase와 restartPolicy의 관계

  • Always → Pod Phase는 항상 Running 유지
  • OnFailure → Exit 0이면 Succeeded, Exit ≠ 0이면 재시작하다 CrashLoopBackOff
  • Never → 종료되면 바로 Succeeded 또는 Failed

 

restartPolicy는 Pod 단위로 설정되어, Pod 내 모든 컨테이너에 적용되어

시스템 헬스체크를 할 때 꼭 알아야하는 정보이다.

값마다 Pod를 다르게 종료시키며, 당연할 수 있겠지만 초기화 작업 담당인 init Container는 restartPolicy에 영향받지 않는다는 사실은 꼭 기억해야겠다.

 

반응형