🔄 쿠버네티스 Pod의 생명주기와 상태 관리
🧩 Pod란 무엇인가요?
Pod는 쿠버네티스에서 컨테이너가 실제로 실행되는 가장 작은 단위입니다. 보통 하나의 Pod에는 하나의 컨테이너가 들어가 있지만, 경우에 따라 여러 컨테이너가 함께 들어가기도 합니다.
쿠버네티스에서 애플리케이션이 배포되면, 그 중심에는 항상 Pod가 존재합니다. 하지만 Pod는 단순히 실행되고 끝나는 것이 아니라, 다양한 상태(state)를 거치며 동작합니다.
🚦 Pod 생명주기 상태 흐름도
아래는 Pod가 생성되고 종료되기까지 거치는 주요 상태입니다:
이 상태들은 kubectl get pods 명령어를 통해 확인할 수 있습니다.
🔍 각 상태 설명
1. Pending
- 설명: Pod가 생성되었지만 아직 모든 컨테이너가 실행되지 않은 상태입니다.
- 원인 예시:
- 스케줄러가 아직 노드를 선택하지 못함
- 필요한 이미지 다운로드 중
- PVC(영구 볼륨)가 연결되지 않음
- init container가 아직 종료되지 않음
2. Running
- 설명: 모든 컨테이너가 성공적으로 시작되고, Pod가 정상적으로 동작 중인 상태입니다.
- 추가: 이 상태에서도
Readiness Probe가 실패하면 서비스는 연결되지 않을 수 있음 - 내부 상태 세분화:
- Initializing: init container 실행 중
- Ready: 서비스에 트래픽 전달 가능
3. Succeeded
- 설명: Pod 내 모든 컨테이너가 성공적으로 종료되었고, 다시 시작될 필요가 없을 때 나타납니다.
- 예시: 배치 작업(batch job), 단발성 작업이 완료된 경우
- 특징: Pod는 자동으로 삭제되지 않으며, 사용자가 수동으로 삭제해야 합니다.
4. Failed
- 설명: 컨테이너 중 하나 이상이 오류로 인해 비정상 종료되었고, 자동 재시작 없이 Pod가 종료된 상태입니다.
- 원인 예시:
- 실행 파일 오류, 잘못된 환경변수, 볼륨 마운트 실패 등
- 차이점:
restartPolicy: Never일 때는 실패 후 재시작하지 않음
5. CrashLoopBackOff
- 설명: 컨테이너가 시작되었지만, 곧바로 충돌하여 반복적으로 재시작되는 상태입니다.
- 의미: 쿠버네티스는 계속해서 컨테이너를 다시 실행하려 하지만 실패가 반복됨
- 해결 방법:
kubectl describe pod [이름]으로 상세 로그 확인- 잘못된 설정, 의존성 문제, 환경변수 오류 확인
🔥 CrashLoopBackOff가 발생하는 대표적인 원인 예시
| 원인 | 설명 및 예시 |
|---|---|
| 애플리케이션 오류 | 컨테이너 내부 실행 파일이 예외를 발생시켜 종료 예: Java 애플리케이션에서 NullPointerException 발생 후 즉시 종료 |
| 잘못된 Command/Entrypoint | YAML의 command 또는 args 설정 오류예: command: ["exit", "1"] |
| 환경변수 누락 | ENV_VAR=DATABASE_URL 설정이 빠져서 실행 시 DB 연결 실패 |
| 의존 서비스 미작동 | 컨테이너 시작 시 다른 API 서버나 DB에 의존할 경우, 해당 서비스가 준비되지 않아서 실패 반복 |
| Health Check 실패 | livenessProbe에서 실패를 반복하여 컨테이너가 강제 재시작됨 |
| 이미지 문제 | imagePullPolicy: Always로 설정하고 레지스트리에 없는 태그 사용 시 컨테이너 실행 실패 반복 |
🧠 상태 관리 시 체크포인트
| 명령어 | 설명 |
|---|---|
kubectl get pods |
Pod 상태 목록 간략 확인 |
kubectl describe pod [이름] |
상태 변화 이력, 이벤트 로그 확인 |
kubectl logs [이름] |
컨테이너 로그 확인 (오류 원인 파악) |
kubectl exec -it [이름] -- sh |
Pod 내부에서 직접 디버깅 |
🛠 실습 예시: CrashLoopBackOff 상태 만들기
다음과 같은 명령어로 일부러 잘못된 Pod를 만들어 상태를 확인할 수 있습니다:
apiVersion: v1
kind: Pod
metadata:
name: crash-test
spec:
containers:
- name: bad-container
image: busybox
command: ['sh', '-c', 'exit 1']
kubectl apply -f crash-test.yaml
kubectl get pods
kubectl describe pod crash-test
이 Pod는 exit 1 명령으로 항상 실패하기 때문에 CrashLoopBackOff 상태로 진입하게 됩니다.
또 다른 예시:
apiVersion: v1
kind: Pod
metadata:
name: missing-env
spec:
containers:
- name: app
image: myapp:latest
env:
- name: API_KEY
valueFrom:
configMapKeyRef:
name: missing-config
key: apiKey
위 예시는 존재하지 않는 ConfigMap을 참조해 컨테이너 시작 시 환경 변수 오류가 발생합니다.
📚 마무리 요약
- Pod는 단순히 실행되는 것이 아니라 여러 상태를 거칩니다.
- Pending, Running, Succeeded, Failed, CrashLoopBackOff 상태를 이해하면 운영 시 문제를 빠르게 파악할 수 있습니다.
- 상태 변화는
kubectl명령어를 활용해 쉽게 확인 가능하며, 적절한 로그 분석이 중요합니다.
쿠버네티스의 Pod 상태를 잘 이해하는 것은 클러스터 운영 능력을 높이는 첫걸음입니다!
📎 참고자료:
- https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/
- https://learnk8s.io/pod-lifecycle
- 한국폴리텍대학 서울강서캠퍼스 빅데이터소프트웨어공학과 이협건 교수 강의자료