Kubernetes/Kubernetes Advanced

📌 [StatefulSet 심화편 #3] StatefulSet의 데이터 영속성과 Persistent Volume 관리

ygtoken 2025. 3. 13. 11:00
728x90

 

1️⃣ 개요

 

StatefulSet을 사용하는 가장 큰 이유 중 하나는 Pod가 재시작되거나 이동하더라도 데이터가 유지되어야 하기 때문입니다.

쿠버네티스에서 Persistent Volume(PV)과 Persistent Volume Claim(PVC) 을 활용하면 StatefulSet의 Pod가 데이터를 안전하게 저장하고 유지할 수 있습니다.

 

이번 글에서는 StatefulSet과 Persistent Volume의 관계, PVC 자동 생성 원리, 데이터 유지 및 삭제 시 고려해야 할 사항을 설명하겠습니다. 🚀

 


2️⃣ StatefulSet과 Persistent Volume의 관계

 

✅ 1. StatefulSet과 Persistent Volume의 동작 원리

 

StatefulSet을 사용할 때 각 Pod는 고유한 Persistent Volume을 가지며, 동일한 Pod가 다시 생성되더라도 이전의 Persistent Volume을 유지해야 합니다.

 

📌 StatefulSet Pod와 Persistent Volume의 매핑 방식

 

Pod 이름 Persistent Volume Claim (PVC) Persistent Volume (PV)
mysql-0 mysql-data-mysql-0 pv-mysql-0
mysql-1 mysql-data-mysql-1 pv-mysql-1
mysql-2 mysql-data-mysql-2 pv-mysql-2

각 Pod는 자체 PVC를 생성하며, 같은 PVC를 다시 사용하여 데이터가 유지됩니다.

 


3️⃣ StatefulSet과 Persistent Volume 설정 방법

 

✅ 1. StatefulSet에서 Persistent Volume을 사용하는 방법

 

StatefulSet에서 각 Pod가 독립적인 저장소를 가지려면 volumeClaimTemplates 를 사용해야 합니다.

이를 통해 각 Pod가 자동으로 PVC를 생성하고, PV와 연결됩니다.

 

📌 StatefulSet에서 Persistent Volume을 사용하는 예제 (MySQL 클러스터)

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  serviceName: mysql
  replicas: 3
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - name: mysql
          image: mysql:8
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: "password"
          volumeMounts:
            - name: mysql-data
              mountPath: /var/lib/mysql
  volumeClaimTemplates:
    - metadata:
        name: mysql-data
      spec:
        accessModes: ["ReadWriteOnce"]
        resources:
          requests:
            storage: 5Gi

 

📌 StatefulSet 배포

kubectl apply -f mysql-statefulset.yaml

 

📌 PVC 자동 생성 확인

kubectl get pvc

각 Pod마다 독립적인 PVC가 생성되며, 데이터가 유지됩니다.

 


✅ 2. PVC와 PV의 동적 프로비저닝 설정

 

StatefulSet의 PVC는 StorageClass를 활용하면 자동으로 Persistent Volume을 생성할 수 있습니다.

 

📌 StorageClass 설정 (동적 프로비저닝 지원)

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast-storage
provisioner: kubernetes.io/aws-ebs  # 클라우드 환경에 따라 변경 가능
parameters:
  type: gp2

 

📌 StorageClass를 사용하는 StatefulSet 예제

volumeClaimTemplates:
  - metadata:
      name: mysql-data
    spec:
      storageClassName: fast-storage
      accessModes: ["ReadWriteOnce"]
      resources:
        requests:
          storage: 10Gi

StorageClass를 사용하면 PVC 요청 시 자동으로 PV가 생성됩니다.

 


4️⃣ StatefulSet 삭제 시 데이터 유지 및 복구

 

✅ 1. StatefulSet 삭제 시 데이터를 유지하는 방법

 

StatefulSet을 삭제할 때, Pod는 삭제되더라도 Persistent Volume은 유지됩니다.

하지만 기본 설정으로 삭제하면 PVC도 함께 삭제될 수 있으므로 주의해야 합니다.

 

📌 StatefulSet을 삭제하되, PVC는 유지하는 방법

kubectl delete statefulset mysql --cascade=orphan

이렇게 하면 StatefulSet만 삭제되고, PVC는 유지되어 데이터가 보존됩니다.

 


✅ 2. StatefulSet을 다시 생성하고 기존 데이터 복구하기

 

StatefulSet을 다시 생성하면 PVC가 동일한 이름으로 유지되므로, 기존 데이터를 사용할 수 있습니다.

 

📌 새 StatefulSet을 다시 배포하면 PVC가 유지된 상태에서 기존 데이터를 그대로 사용

kubectl apply -f mysql-statefulset.yaml

이 방식은 데이터 손실 없이 StatefulSet을 재배포하는 데 유용합니다.

 


✅ 3. StatefulSet 삭제 후 PVC 및 PV까지 제거하는 방법

 

만약 데이터가 더 이상 필요 없고, 완전히 삭제하려면 PVC와 PV도 함께 삭제해야 합니다.

 

📌 PVC 및 PV 삭제

kubectl delete pvc -l app=mysql
kubectl delete pv -l app=mysql

이 명령어를 실행하면 데이터까지 완전히 삭제됩니다.

 


5️⃣ StatefulSet 운영 시 고려해야 할 점

 

✅ 1. Pod 재시작 시 기존 볼륨 유지 여부 확인

StatefulSet의 Pod가 삭제되었다가 다시 생성될 때, 기존 데이터를 유지하려면 PVC가 자동으로 이전 PV와 연결되어야 합니다.

kubectl get pvc를 실행하여 PVC가 올바르게 유지되고 있는지 확인하세요.

 

✅ 2. 볼륨이 ReadWriteOnce(RWO)인지 확인

대부분의 블록 스토리지(EBS, Azure Disk, GCE Persistent Disk 등)는 ReadWriteOnce(RWO) 모드만 지원하므로,

여러 노드에서 동시에 같은 PV를 사용할 수 없습니다.

만약 다중 노드에서 볼륨을 공유해야 한다면, ReadWriteMany(RWX)를 지원하는 NFS나 CephFS 같은 스토리지를 사용해야 합니다.

 

📌 ReadWriteMany(RWX)를 지원하는 NFS 기반 PV 예제

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  nfs:
    path: /mnt/nfs
    server: 192.168.1.100

RWX 볼륨을 사용하면 다중 노드에서 공유 스토리지를 활용할 수 있습니다.

 


🔥 6️⃣ 결론

 

StatefulSet은 Pod가 재시작되더라도 데이터를 유지해야 할 때 사용

각 Pod는 개별적인 PVC를 가지며, Persistent Volume과 자동으로 연결됨

StorageClass를 활용하면 PVC 요청 시 자동으로 PV를 생성할 수 있음

StatefulSet 삭제 시 --cascade=orphan 옵션을 사용하면 PVC를 유지 가능

PVC와 PV를 삭제하지 않으면 StatefulSet을 다시 배포할 때 기존 데이터를 복구 가능

RWX 스토리지가 필요하면 NFS 또는 CephFS 같은 공유 스토리지를 고려해야 함

728x90