Kubernetes/Kubernetes Advanced

📌 [StatefulSet 심화편 #8] StatefulSet의 Pod 삭제 후 재생성 시 네트워크 및 데이터 유지

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

 

1️⃣ 개요

 

쿠버네티스의 StatefulSet은 Pod가 삭제되더라도 동일한 네트워크 ID와 데이터를 유지하는 것이 핵심입니다.

하지만 Pod를 삭제하고 재생성하는 과정에서 네트워크 주소가 변경되거나, PVC가 올바르게 연결되지 않는 문제가 발생할 수 있습니다.

 

이번 글에서는 StatefulSet의 Pod를 삭제한 후에도 네트워크 및 데이터를 유지하는 방법과 고려해야 할 사항을 정리하겠습니다. 🚀

 


2️⃣ StatefulSet Pod 삭제 후 재생성 원리

 

✅ 1. StatefulSet Pod는 네트워크와 데이터를 유지해야 함

 

StatefulSet은 각 Pod가 고유한 이름과 Persistent Volume을 유지하도록 설계되어 있습니다.

Pod를 삭제해도 다음과 같은 요소는 유지되어야 합니다.

 

📌 StatefulSet Pod 삭제 후에도 유지해야 할 것

요소 설명
Pod 이름 pod-0, pod-1, pod-2와 같은 고유 ID 유지
DNS 주소 pod-0.service-name과 같은 네트워크 ID 유지
Persistent Volume Pod가 삭제되어도 기존 PVC를 유지해야 함
Headless Service DNS를 통해 StatefulSet Pod 간 통신 유지

StatefulSet은 Pod가 삭제되더라도 동일한 네트워크 및 데이터를 유지해야 합니다.

 


3️⃣ StatefulSet Pod 삭제 후 네트워크 유지 방법

 

✅ 1. Headless Service를 활용한 네트워크 유지

 

StatefulSet Pod가 삭제되었다가 다시 생성될 때, 기존 네트워크 주소(DNS)가 변경되지 않도록 해야 합니다.

이를 위해 Headless Service를 사용하여 각 Pod에 고유한 DNS 주소를 유지합니다.

 

📌 Headless Service 설정 예제

apiVersion: v1
kind: Service
metadata:
  name: mysql-headless
spec:
  clusterIP: None  # Headless Service 설정
  selector:
    app: mysql
  ports:
    - port: 3306

 

📌 Headless Service 적용 후 DNS 확인

kubectl get svc

 

📌 Pod 삭제 후에도 동일한 네트워크 주소 유지 확인

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

이렇게 하면 StatefulSet Pod가 삭제되더라도 동일한 네트워크 주소를 유지할 수 있습니다.

 


✅ 2. Pod 삭제 후 네트워크 문제 해결

 

Pod 삭제 후 네트워크가 정상적으로 복구되지 않으면 다음을 확인해야 합니다.

 

📌 (1) Pod가 삭제된 후에도 Headless Service가 유지되는지 확인

kubectl get svc mysql-headless

 

📌 (2) 네트워크 확인을 위해 다른 Pod에서 DNS 조회

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

 

📌 (3) CoreDNS가 정상적으로 동작하는지 확인

kubectl get pods -n kube-system | grep coredns

네트워크 연결이 문제라면 Headless Service와 DNS 설정을 점검해야 합니다.

 


4️⃣ StatefulSet Pod 삭제 후 데이터 유지 방법

 

✅ 1. PVC를 유지한 채 Pod 삭제하기

 

기본적으로 StatefulSet의 Pod를 삭제하면 PVC는 자동으로 유지됩니다.

하지만 Pod가 삭제된 후 새로운 PVC가 생성되지 않도록 해야 합니다.

 

📌 PVC를 유지한 채 특정 Pod 삭제

kubectl delete pod mysql-1 --cascade=orphan

 

📌 PVC가 그대로 유지되는지 확인

kubectl get pvc

이렇게 하면 StatefulSet Pod가 삭제되어도 기존 PVC가 유지됩니다.

 


✅ 2. StatefulSet Pod가 새로운 PVC를 생성하는 경우 해결 방법

 

StatefulSet Pod가 다시 생성될 때 기존 PVC가 아닌 새로운 PVC를 사용하려고 하면 데이터가 손실될 수 있습니다.

이를 방지하려면 PVC 이름이 변경되지 않았는지 확인하고, 기존 PVC를 강제로 다시 연결해야 합니다.

 

📌 PVC와 PV가 기존 Pod와 올바르게 연결되었는지 확인

kubectl describe pvc mysql-data-mysql-1

 

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

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

이렇게 하면 기존 PVC를 유지하면서 StatefulSet Pod를 다시 생성할 수 있습니다.

 


5️⃣ StatefulSet Pod 삭제 후 정상적으로 재배치되지 않는 경우 해결 방법

 

✅ 1. 특정 Pod가 Pending 상태에서 멈춰 있는 경우

 

📌 Pod가 Pending 상태인지 확인

kubectl get pods -l app=mysql

 

📌 PVC가 제대로 마운트되지 않은 경우 PVC 상태 확인

kubectl get pvc

 

📌 PVC가 바인딩되지 않은 경우 강제 바인딩

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

PVC가 정상적으로 연결되지 않으면 StatefulSet Pod는 정상적으로 실행되지 않습니다.

 


✅ 2. Pod가 삭제된 후에도 네트워크 연결이 되지 않는 경우

 

📌 DNS 조회로 네트워크 주소 확인

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

 

📌 네트워크 문제 해결을 위해 CoreDNS 상태 확인

kubectl get pods -n kube-system | grep coredns
kubectl logs -n kube-system -l k8s-app=kube-dns

네트워크 장애가 지속된다면 CoreDNS를 점검하고, Headless Service 설정을 다시 확인해야 합니다.

 


6️⃣ StatefulSet Pod 삭제 후 정상적으로 동작하는지 확인

 

📌 (1) Pod가 정상적으로 재배치되었는지 확인

kubectl get pods -l app=mysql -o wide

 

📌 (2) PVC가 올바르게 마운트되었는지 확인

kubectl get pvc

 

📌 (3) 네트워크가 정상적으로 복구되었는지 확인

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

이러한 점검을 통해 StatefulSet Pod가 정상적으로 재생성되었는지 확인할 수 있습니다.

 


🔥 7️⃣ 결론

 

StatefulSet Pod가 삭제되더라도 네트워크 ID와 PVC를 유지해야 함

Headless Service를 활용하면 Pod의 네트워크 주소가 변경되지 않도록 설정할 수 있음

Pod를 삭제할 때 --cascade=orphan 옵션을 사용하면 PVC를 유지하면서 삭제 가능

PVC가 새로운 Pod에 자동으로 연결되지 않는 경우 수동으로 다시 연결해야 함

Pod 삭제 후 Pending 상태가 지속된다면 PVC 상태를 점검해야 함

네트워크 장애가 발생하면 CoreDNS 로그를 확인하고 Headless Service 설정을 점검해야 함

728x90