Kubernetes/Kubernetes Advanced

📌 [StatefulSet 심화편 #27] StatefulSet에서 서비스 장애 대응 및 Auto Healing(자동 복구) 설정

ygtoken 2025. 3. 15. 11:21
728x90

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가 유지되도록 설정 가능

장애 발생 시 로그 분석 및 복구 프로세스를 준비하여 빠르게 대응할 수 있도록 해야 함

 

728x90