반응형
쿠버네티스 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에 영향받지 않는다는 사실은 꼭 기억해야겠다.
반응형
'OPS' 카테고리의 다른 글
DevOps 스터디 - 커스텀 리소스와 컨트롤러 #2 (1) | 2025.06.15 |
---|---|
DevOps 스터디 - 커스텀 리소스와 컨트롤러 #1 (0) | 2025.06.15 |
DevOps 스터디 - 애플리케이션 배포를 위한 고급 설정 #1 (2) | 2025.06.15 |
Athena 특정 일자 LB 엑세스 로그 조회 (0) | 2025.06.15 |
kubectl apply 명령어 동작 원리 (0) | 2025.06.15 |