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 설정을 점검해야 함
'Kubernetes > Kubernetes Advanced' 카테고리의 다른 글
📌 [StatefulSet 심화편 #10] StatefulSet의 Pod 강제 이동 (Node 간 재배치 방법) (0) | 2025.03.14 |
---|---|
📌 [StatefulSet 심화편 #9] StatefulSet과 PreStop Hook을 활용한 안전한 Pod 종료 전략 (0) | 2025.03.14 |
📌 [StatefulSet 심화편 #7] StatefulSet에서 특정 Pod 재시작 및 복구 전략 (0) | 2025.03.14 |
📌 [StatefulSet 심화편 #6] StatefulSet의 장애 복구와 데이터 정합성 유지 전략 (0) | 2025.03.14 |
📌 [StatefulSet 심화편 #5] StatefulSet의 스케일링 전략과 리밸런싱 문제 해결 (0) | 2025.03.13 |