1️⃣ 개요
StatefulSet을 운영할 때 Pod 장애, 스토리지 오류, 네트워크 문제 등으로 인해 서비스가 정상적으로 운영되지 않을 수 있습니다.
특히 StatefulSet은 각 Pod가 고유한 ID와 Persistent Volume을 유지해야 하므로, 장애 발생 시 복구 전략을 신중하게 설계해야 합니다.
이번 글에서는 StatefulSet에서 발생할 수 있는 주요 장애 유형을 정리하고, Auto Healing(자동 복구) 설정 방법을 설명하겠습니다. 🚀
2️⃣ StatefulSet에서 발생할 수 있는 장애 유형
📌 StatefulSet 운영 중 발생할 수 있는 주요 장애 유형과 원인
장애 유형 | 설명 | 해결 방법 |
Pod 장애 | Pod가 CrashLoopBackOff 상태가 됨 | Liveness Probe 및 Auto Restart 설정 |
PVC 손실 | Persistent Volume이 마운트되지 않음 | PVC 복구 및 Retain 정책 활용 |
노드 장애 | Pod가 실행 중인 노드가 다운됨 | Pod Eviction 및 새로운 노드로 이동 |
네트워크 장애 | Pod 간 통신 불가능 | NetworkPolicy 및 Service 재구성 |
✅ 장애 유형별로 적절한 복구 전략을 마련해야 안정적인 StatefulSet 운영이 가능합니다.
3️⃣ StatefulSet에서 Auto Healing 설정 방법
✅ 1. Liveness Probe를 활용한 자동 복구 설정
📌 Liveness Probe를 설정하면 Pod가 비정상 상태일 때 자동으로 재시작됩니다.
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 20
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 3
📌 Liveness Probe 상태 확인 명령어
kubectl describe pod myapp-0 | grep Liveness
✅ Pod가 비정상 상태에 빠질 경우, Kubernetes가 자동으로 재시작하여 서비스 다운타임을 최소화할 수 있습니다.
✅ 2. StatefulSet Pod Eviction을 통한 장애 노드 복구
📌 노드 장애 발생 시, 해당 노드에서 StatefulSet Pod를 강제 이동해야 합니다.
📌 (1) 장애 발생한 노드 확인
kubectl get nodes
📌 (2) 노드를 스케줄링 불가능 상태로 변경 (cordon)
kubectl cordon node-1
📌 (3) 현재 실행 중인 StatefulSet Pod 강제 제거 (drain)
kubectl drain node-1 --ignore-daemonsets --delete-emptydir-data
✅ 이제 StatefulSet Pod가 정상적인 다른 노드로 이동하여 실행됩니다.
✅ 3. Persistent Volume 복구 및 PVC 재사용 설정
📌 PVC가 삭제되었거나 손상된 경우, Retain 정책을 설정하여 데이터를 보호할 수 있습니다.
📌 (1) 기존 Persistent Volume 확인
kubectl get pv
📌 (2) PVC 삭제 후에도 PV가 유지되도록 Retain 정책 설정
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv
spec:
persistentVolumeReclaimPolicy: Retain # PVC 삭제 후에도 PV 유지
📌 (3) 새로운 PVC를 기존 PV에 연결하여 데이터 복구
kubectl patch pv mysql-pv -p '{"spec":{"claimRef":{"name":"mysql-data","namespace":"default"}}}'
✅ Retain 정책을 설정하면 StatefulSet Pod가 삭제되더라도 PVC 데이터를 보호할 수 있습니다.
✅ 4. PodDisruptionBudget(PDB)을 활용한 최소 가용 인스턴스 유지
📌 PodDisruptionBudget(PDB)을 활용하면, 최소한의 StatefulSet Pod가 항상 유지되도록 설정할 수 있습니다.
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: mysql-pdb
spec:
minAvailable: 2
selector:
matchLabels:
app: mysql
📌 PDB 상태 확인 명령어
kubectl get pdb
✅ 이제 장애 발생 시 최소 2개의 Pod가 항상 유지되도록 보장됩니다.
4️⃣ StatefulSet 장애 발생 시 복구 프로세스 예제
📌 시나리오 1: StatefulSet Pod가 CrashLoopBackOff 상태일 때
📌 현재 상태 확인
kubectl get pod -l app=myapp
출력 예시:
myapp-0 CrashLoopBackOff
myapp-1 Running
📌 (1) 로그 확인
kubectl logs myapp-0
📌 (2) Liveness Probe 실패로 인한 문제일 경우
• Liveness Probe 주기를 늘려서 조정
• 애플리케이션 초기화 과정이 길다면 initialDelaySeconds 값 증가
📌 (3) Pod 강제 재시작
kubectl delete pod myapp-0
✅ 이제 Pod가 정상적으로 다시 실행될 것입니다.
📌 시나리오 2: StatefulSet PVC가 손실된 경우
📌 현재 PVC 상태 확인
kubectl get pvc
출력 예시:
NAME STATUS VOLUME CAPACITY
mysql-data-mysql-0 Lost pvc-12345678 10Gi
📌 (1) 기존 PV 확인 및 복구
kubectl get pv | grep mysql-data-mysql-0
📌 (2) Retain 정책이 설정된 경우, 기존 PV를 새로운 PVC와 연결
kubectl patch pv pvc-12345678 -p '{"spec":{"claimRef":{"name":"mysql-data","namespace":"default"}}}'
📌 (3) StatefulSet Pod 다시 실행
kubectl scale statefulset mysql --replicas=0
kubectl scale statefulset mysql --replicas=3
✅ 이제 StatefulSet Pod가 다시 실행되면서 데이터가 정상적으로 복구됩니다.
🔥 5️⃣ 결론
✔ Liveness Probe를 활용하면 StatefulSet Pod가 비정상 상태일 때 자동 복구 가능
✔ Node 장애 발생 시 cordon 및 drain 명령어를 활용하여 Pod를 강제 이동 가능
✔ PVC가 손실될 경우 Retain 정책을 설정하여 데이터를 보호하고 복구 가능
✔ PodDisruptionBudget(PDB)를 활용하면 장애 발생 시 최소한의 Pod가 유지되도록 설정 가능
✔ 장애 발생 시 로그 분석 및 복구 프로세스를 준비하여 빠르게 대응할 수 있도록 해야 함