1️⃣ 개요
쿠버네티스를 운영하다 보면 Pod가 예상치 못하게 종료되거나 비정상적으로 동작하는 경우가 발생할 수 있습니다.
특히, 애플리케이션 오류, 네트워크 장애, 노드 장애 등의 원인으로 인해 Pod가 다운되면 서비스 운영에 큰 영향을 미칠 수 있습니다.
쿠버네티스는 Pod의 장애를 감지하고 자동으로 복구할 수 있는 여러 기능을 제공하며, 이를 활용하면 서비스의 안정성을 높일 수 있습니다.
이번 글에서는 Pod 장애 유형과 원인, 해결 방법을 표로 정리하고, 자동 복구 전략을 적용하는 방법을 설명하겠습니다.
2️⃣ Pod 장애 유형과 해결 방법
쿠버네티스 환경에서 Pod 장애는 여러 가지 이유로 발생할 수 있으며, 이를 효과적으로 관리하기 위해 원인과 해결 방법을 함께 정리하였습니다.
📌 Pod 장애 유형 및 해결 방법 정리
장애 유형 | 원인 | 해결 방법 |
애플리케이션 충돌 | 컨테이너 내부 애플리케이션이 비정상 종료됨 | livenessProbe 설정 |
메모리 부족 (OOM) | 리소스 제한 초과로 강제 종료 | requests & limits 조정 |
노드 장애 | 노드 다운 또는 자원 부족 | 다른 노드로 재배치 (affinity 설정) |
네트워크 문제 | Pod 간 통신 불가 또는 외부 접근 문제 | NetworkPolicy 및 CoreDNS 확인 |
장기 실행 Pod의 리소스 누수 | 메모리 누수 또는 과도한 CPU 사용 | Vertical Pod Autoscaler(VPA) 활용 |
3️⃣ Pod 자동 재시작 설정 (restartPolicy)
Pod가 종료되었을 때 자동으로 재시작되도록 하려면 restartPolicy 설정을 이해해야 합니다.
📌 Pod의 restartPolicy 옵션
설정 값 | 설명 | 적용 대상 |
Always | Pod가 종료될 경우 항상 재시작 | Deployment, DaemonSet |
OnFailure | 실패한 경우만 재시작 | Job, CronJob |
Never | Pod가 종료되면 그대로 유지 | 특정 테스트 Pod |
📌 예제: Pod의 restartPolicy 설정
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
restartPolicy: Always
containers:
- name: my-container
image: my-app:v1
✅ Deployment의 경우 기본적으로 restartPolicy: Always가 적용되므로 따로 설정할 필요가 없습니다.
✅ Job은 OnFailure를 사용하여 실패한 경우에만 재시작하도록 설정할 수 있습니다.
4️⃣ Pod 장애 감지 및 자동 복구 (livenessProbe, readinessProbe)
애플리케이션이 정상적으로 동작하는지 감지하기 위해 쿠버네티스에서는 livenessProbe와 readinessProbe를 제공합니다.
이를 활용하면 Pod가 비정상적으로 동작할 때 자동으로 재시작할 수 있습니다.
📌 Pod 상태 감지 프로브 설정 정리
프로브 종류 | 설명 | 주요 목적 |
livenessProbe | 컨테이너가 정상적으로 실행되고 있는지 확인 | Pod 자동 재시작 |
readinessProbe | 서비스가 정상적으로 트래픽을 받을 수 있는지 확인 | 서비스 트래픽 조정 |
📌 예제: HTTP 기반 livenessProbe 설정
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 3
periodSeconds: 10
📌 예제: 실행 명령어 기반 livenessProbe 설정
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 10
✅ livenessProbe가 실패하면 컨테이너가 자동으로 재시작됩니다.
✅ readinessProbe를 함께 설정하면, Pod가 준비되지 않았을 때 트래픽을 받지 않도록 조정할 수 있습니다.
5️⃣ Pod 장애 발생 시 자동 대체 (Pod Eviction & Rescheduling)
쿠버네티스는 노드 장애가 발생하면 Pod를 자동으로 다른 노드로 이동시킬 수 있습니다.
이를 위해 nodeSelector, affinity, taints & tolerations 등의 설정을 활용해야 합니다.
📌 Pod 자동 재배치 설정 정리
설정 옵션 | 설명 | 주요 목적 |
nodeSelector | 특정 노드에서만 Pod 실행을 강제 지정 | 특정 워크로드 배포 |
affinity | 우선적으로 배포될 노드 조건 설정 | 장애 발생 시 유연한 배포 |
taints & tolerations | 특정 Pod가 특정 노드에서만 실행되도록 제한 | 고급 리소스 제어 |
📌 예제: 특정 노드에 종속되지 않도록 설정 (affinity)
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: kubernetes.io/e2e-az-name
operator: In
values:
- zone-a
- zone-b
✅ 이 설정을 사용하면 특정 노드에 장애가 발생해도 다른 노드에서 실행될 수 있도록 유연하게 조정할 수 있습니다.
6️⃣ Pod의 장애 복구를 위한 추가 전략
✅ PodDisruptionBudget(PDB) 설정하여 장애 복구 보호
Pod가 운영 중인 상태에서 불필요하게 종료되지 않도록 PodDisruptionBudget(PDB)을 설정할 수 있습니다.
📌 PDB 설정 정리
설정 값 | 설명 | 주요 목적 |
minAvailable | 최소한 유지해야 할 Pod 개수 지정 | 서비스 안정성 유지 |
maxUnavailable | 동시에 종료될 수 있는 Pod 개수 설정 | 롤링 업데이트 보호 |
📌 예제: 최소 2개 Pod 유지 보장
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: my-app-pdb
spec:
minAvailable: 2
selector:
matchLabels:
app: my-app
✅ 이 설정을 사용하면 최소 2개의 Pod가 항상 유지되도록 보장할 수 있습니다.
✅ 특정 Pod를 삭제해야 하는 경우에도 운영에 문제가 없도록 설정할 수 있습니다.
🔥 7️⃣ 결론
✔ 쿠버네티스는 Pod 장애를 자동으로 감지하고 복구할 수 있도록 다양한 기능을 제공합니다.
✔ 애플리케이션이 정상적으로 동작하는지 감지하려면 livenessProbe와 readinessProbe를 설정하는 것이 필수적입니다.
✔ 노드 장애 시 자동으로 Pod를 재배치하려면 affinity 및 PodDisruptionBudget을 적절히 설정해야 합니다.
✔ Pod가 종료될 경우 자동으로 재시작하려면 restartPolicy를 적절히 설정해야 합니다.
'Kubernetes > Kubernetes Advanced' 카테고리의 다른 글
📌 [Pod 심화편 #6] Pod 트러블슈팅: 자주 발생하는 문제들 (0) | 2025.03.12 |
---|---|
📌 [Pod 심화편 #5] Pod의 로그 및 모니터링 최적화 (0) | 2025.03.12 |
📌 [Pod 심화편 #3] Pod의 네트워크 문제와 디버깅 방법 (0) | 2025.03.12 |
📌 [Pod 심화편 #2] Pod의 리소스 관리와 OOM(Out of Memory) 문제 해결 (0) | 2025.03.12 |
📌 [Pod 심화편 #1] Pod의 생성과 스케줄링 원리 (0) | 2025.03.12 |