반응형
쿠버네티스를 운영하다 보면 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) 전략을 설계하는 첫걸음입니다.
반응형
'DevOps > Kubernetes' 카테고리의 다른 글
| [k8s] 외부 서비스 접근을 위한 Service(ClusterIP, NodePort, LoadBalancer) 알아보기 (1) | 2026.03.13 |
|---|---|
| [Kubernetes] ReplicaSet과 Deployment, 대체 뭐가 다른 걸까? (차이점 명확히 알기) (1) | 2026.03.11 |
| [Kubernetes] 쿠버네티스 Deployment 완벽 정리: 중단 없는 서비스 배포의 핵심 (0) | 2026.03.06 |
| [Kubernetes] Kubernetes ReplicaSet과 Replicas 완벽 이해하기 (0) | 2026.03.04 |
| [Kubernetes] 어플리케이션의 생명주기와 관리: 프로브(Probes)와 레이블(Labels) (0) | 2026.03.03 |
댓글