Kubernetes/Kubernetes Advanced

📌 [StatefulSet 심화편 #7] StatefulSet에서 특정 Pod 재시작 및 복구 전략

ygtoken 2025. 3. 14. 10:12
728x90

 

1️⃣ 개요

 

쿠버네티스의 StatefulSet은 Pod의 ID와 Persistent Volume을 유지하면서 안정적으로 운영하는 것이 핵심입니다.

그러나 특정 Pod에서 장애가 발생하거나, 강제 재시작이 필요한 경우 일반적인 Deployment와 달리 추가적인 고려사항이 필요합니다.

 

이번 글에서는 StatefulSet의 특정 Pod를 재시작하는 방법과, 재시작 후 데이터 정합성을 유지하는 전략을 설명하겠습니다. 🚀

 


2️⃣ StatefulSet에서 특정 Pod를 재시작해야 하는 경우

 

일반적인 Deployment 환경에서는 Pod를 삭제하면 새로운 Pod가 자동 생성되므로, 단순한 명령어로 재시작이 가능합니다.

그러나 StatefulSet에서는 특정 Pod를 재시작할 때 데이터 무결성과 네트워크 ID를 유지해야 합니다.

 

📌 특정 Pod를 재시작해야 하는 주요 상황

상황 설명 해결 방법
애플리케이션 장애 (CrashLoopBackOff 등) 특정 Pod가 정상적으로 기동되지 않음 kubectl delete pod 후 PVC 확인
네트워크 문제 특정 Pod만 네트워크에 연결되지 않음 Pod 재시작 후 DNS 확인
스토리지 오류 PVC가 제대로 연결되지 않음 PVC와 PV 상태 점검 후 재연결
Pod 내 환경 변수 변경 필요 특정 Pod에서만 환경 변수 업데이트 필요 Pod 재시작 또는 StatefulSet 업데이트

StatefulSet에서는 단순히 Pod를 삭제하는 것이 아니라, 데이터와 네트워크 ID를 고려해야 합니다.

 


3️⃣ StatefulSet에서 특정 Pod 재시작하는 방법

 

✅ 1. 기본적인 Pod 삭제 후 자동 재생성

 

StatefulSet에서 특정 Pod를 재시작하려면, 해당 Pod를 삭제하면 쿠버네티스가 자동으로 새로운 Pod를 생성합니다.

 

📌 특정 StatefulSet Pod 삭제 후 재시작

kubectl delete pod mysql-1

 

📌 Pod 상태 확인

kubectl get pods -l app=mysql

StatefulSet은 동일한 PVC를 유지한 채 Pod를 자동으로 다시 생성합니다.

 


✅ 2. Pod를 안전하게 종료하기 (PreStop Hook 활용)

 

데이터베이스 같은 애플리케이션은 Pod가 종료되기 전에 데이터를 안전하게 저장해야 합니다.

이를 위해 PreStop Hook을 활용하면 Pod가 종료되기 전에 특정 명령을 실행할 수 있습니다.

 

📌 PreStop Hook을 사용한 StatefulSet 예제

lifecycle:
  preStop:
    exec:
      command: [ "mysqladmin", "shutdown" ]

 

📌 StatefulSet 업데이트 후 적용

kubectl apply -f mysql-statefulset.yaml

이제 Pod가 삭제되기 전에 MySQL이 안전하게 종료됩니다.

 


✅ 3. PVC를 유지한 채 특정 Pod를 재시작하기

 

StatefulSet에서는 PVC가 특정 Pod에 연결되어 있으므로, Pod가 다시 시작될 때 동일한 PVC를 유지하는 것이 중요합니다.

PVC가 손상되거나 올바르게 연결되지 않으면 Pod가 정상적으로 실행되지 않을 수 있습니다.

 

📌 PVC 연결 상태 확인

kubectl get pvc

 

📌 PVC를 유지한 채 특정 Pod 재시작

kubectl delete pod mysql-1 --cascade=orphan

이렇게 하면 PVC는 삭제되지 않고, StatefulSet이 새로운 Pod를 생성합니다.

 


4️⃣ 특정 Pod가 재시작되지 않는 경우 해결 방법

 

StatefulSet의 Pod가 정상적으로 재시작되지 않는다면, 다음과 같은 원인을 점검해야 합니다.

 

문제 원인 해결 방법
Pod가 Pending 상태에서 멈춤 노드 리소스 부족, PVC 할당 실패 kubectl describe pod로 상태 확인
Pod가 CrashLoopBackOff 반복 애플리케이션 오류 kubectl logs로 에러 확인
Pod가 새로운 PVC를 생성함 PVC 이름이 변경됨 기존 PVC를 수동으로 연결

 

📌 Pod가 Pending 상태일 때 PVC 연결 확인

kubectl describe pod mysql-1

 

📌 PVC를 수동으로 기존 Pod에 연결

kubectl patch pvc mysql-data-mysql-1 -p '{"metadata":{"ownerReferences":null}}'

PVC가 정상적으로 연결되지 않으면, Pod는 데이터를 복구하지 못할 수 있습니다.

 


5️⃣ StatefulSet Pod 재시작 후 네트워크 점검

 

StatefulSet Pod는 고유한 네트워크 ID(DNS)를 유지해야 합니다.

Pod가 재시작된 후에도 DNS 주소가 정상적으로 유지되는지 확인해야 합니다.

 

📌 Pod의 DNS 확인 (Headless Service 사용 시)

kubectl exec -it mysql-1 -- nslookup mysql-1.mysql

 

📌 네트워크 연결 테스트 (다른 Pod에서 접근 확인)

kubectl exec -it mysql-0 -- ping mysql-1.mysql

네트워크 연결이 정상적으로 복구되었는지 확인해야 합니다.

 


6️⃣ StatefulSet에서 특정 Pod 강제 재배치

 

특정 노드에서 Pod를 이동시키려면 해당 노드를 스케줄링에서 제외하고, Pod를 다시 시작하면 자동으로 다른 노드에서 배치됩니다.

 

📌 특정 노드를 스케줄링 불가능하도록 설정

kubectl cordon 노드이름

 

📌 해당 노드에서 Pod를 강제로 삭제하여 다른 노드로 이동

kubectl delete pod mysql-1

 

📌 Pod가 새로운 노드에서 실행되었는지 확인

kubectl get pods -o wide

이 방법을 활용하면 특정 StatefulSet Pod를 강제로 다른 노드로 이동할 수 있습니다.

 


🔥 7️⃣ 결론

 

StatefulSet에서 특정 Pod를 재시작하려면 kubectl delete pod를 사용해야 함

PVC를 유지한 채 Pod를 재시작하려면 --cascade=orphan 옵션을 활용해야 함

PreStop Hook을 활용하면 Pod가 종료되기 전에 애플리케이션을 안전하게 종료할 수 있음

Pod가 Pending 상태라면 PVC 연결이 정상적으로 유지되고 있는지 확인해야 함

네트워크 장애 시, Pod의 DNS 주소가 유지되는지 nslookup을 활용해 확인 가능

특정 노드에서 StatefulSet Pod를 강제 이동하려면 kubectl cordon과 kubectl delete pod를 조합하여 사용 가능

 

728x90