Kubernetes/Kubernetes Best Practices

[Scenario Playbook Ep.23] 🚀 StatefulSet 편 #2 | PersistentVolume을 활용한 데이터 영속성 유지

ygtoken 2025. 3. 16. 14:55
728x90

 

쿠버네티스에서 StatefulSet은 Pod이 재시작되거나 이동하더라도 데이터를 유지해야 하는 경우에 사용됩니다.

이번 글에서는 PersistentVolumeClaim(PVC)을 활용하여 StatefulSet의 데이터가 유지되도록 설정하는 방법을 다룹니다.

 


📌 글에서 다루는 상황들

 

1️⃣ PersistentVolumeClaim을 사용하여 각 Pod의 데이터 유지

2️⃣ 재시작 후에도 데이터가 유지되는지 검증

 

각 문제를 실무에서 바로 활용할 수 있도록 Manifest 템플릿과 예상 결과 값을 제공합니다.

 


1️⃣ PersistentVolumeClaim을 사용하여 각 Pod의 데이터 유지

 

❓ 문제 상황

 

운영팀에서 각 StatefulSet Pod이 데이터를 저장하고, Pod이 재시작되더라도 데이터를 잃지 않도록 해야 하는 요구사항이 생겼습니다.

Pod이 삭제되거나 이동하더라도, 각 Pod의 데이터를 유지할 수 있도록 PersistentVolume을 사용해야 합니다.

StatefulSet의 이름은 db-statefulset이어야 합니다.

Pod이 각자의 PersistentVolumeClaim을 사용해야 합니다.

각 Pod의 데이터는 개별적으로 유지되어야 합니다.

 

✅ 어떻게 해결할 수 있을까요?

 


🛠️ 해결 방법

 

1. PersistentVolume을 사용하여 각 StatefulSet Pod이 개별적으로 저장 공간을 가질 수 있도록 설정해야 합니다.

volumeClaimTemplates를 사용하여 Pod별로 PVC를 생성

 

2. Pod이 재시작되더라도 데이터를 유지할 수 있도록 PVC를 마운트해야 합니다.

volumeMounts를 사용하여 데이터를 특정 디렉터리에 저장

 


✅ 정답 Manifest (PersistentVolumeClaim을 사용하는 StatefulSet 배포)

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: db-statefulset  # StatefulSet 이름
spec:
  serviceName: "db"  # Headless Service와 연결될 이름
  replicas: 3  # 실행할 Pod 개수
  selector:
    matchLabels:
      app: db  # 레이블을 기반으로 Pod을 선택
  template:
    metadata:
      labels:
        app: db  # Pod 레이블
    spec:
      containers:
      - name: database
        image: postgres:latest  # PostgreSQL 컨테이너 실행
        ports:
        - containerPort: 5432
        volumeMounts:
        - name: db-storage
          mountPath: /var/lib/postgresql/data  # 데이터 저장 경로
  volumeClaimTemplates:
  - metadata:
      name: db-storage  # PVC 이름
    spec:
      accessModes: ["ReadWriteOnce"]
      resources:
        requests:
          storage: 1Gi  # 1Gi 스토리지 할당

 

 


📌 적용 후 예상 결과 값

 

1. StatefulSet 생성 확인

kubectl get statefulset

 

💡 예상 출력 값

NAME               READY   AGE
db-statefulset     3/3     5s

 

2. PersistentVolumeClaim 확인

kubectl get pvc

 

💡 예상 출력 값

NAME                STATUS   VOLUME          CAPACITY   ACCESS MODES   AGE
db-storage-db-0     Bound    pvc-123abc      1Gi        RWO            5s
db-storage-db-1     Bound    pvc-456def      1Gi        RWO            5s
db-storage-db-2     Bound    pvc-789ghi      1Gi        RWO            5s

 

3. Pod에서 데이터가 저장되는지 확인

kubectl exec -it db-0 -- ls /var/lib/postgresql/data

 

💡 예상 출력 값

PG_VERSION  base  global  pg_commit_ts  pg_log  pg_wal

 

 


2️⃣ 재시작 후에도 데이터가 유지되는지 검증

 

❓ 문제 상황

 

운영팀에서 StatefulSet Pod이 삭제되거나 재시작되더라도 기존 데이터가 유지되어야 하는 요구사항이 생겼습니다.

Pod이 삭제된 후 다시 생성되었을 때, 동일한 PersistentVolumeClaim을 사용하여 데이터를 유지하는지 확인해야 합니다.

 

✅ 어떻게 해결할 수 있을까요?

 


🛠️ 해결 방법

 

1. Pod을 삭제한 후 다시 생성하여 PVC가 동일하게 유지되는지 확인해야 합니다.

kubectl delete pod db-0을 실행하여 Pod을 삭제 후 자동 재생성 확인

 

2. 데이터가 정상적으로 유지되는지 확인해야 합니다.

ls /var/lib/postgresql/data를 실행하여 기존 데이터가 남아 있는지 확인

 


✅ 검증 과정

 

1. Pod 삭제 후 자동 복구 확인

kubectl delete pod db-0

 

💡 예상 출력 값

pod "db-0" deleted

 

2. 새로운 Pod이 같은 PVC를 사용하여 다시 생성되었는지 확인

kubectl get pods

 

💡 예상 출력 값

NAME      READY   STATUS    RESTARTS   AGE
db-0      1/1     Running   0          10s
db-1      1/1     Running   0          5m
db-2      1/1     Running   0          5m

 

3. 데이터가 유지되는지 확인

kubectl exec -it db-0 -- ls /var/lib/postgresql/data

 

💡 예상 출력 값

PG_VERSION  base  global  pg_commit_ts  pg_log  pg_wal

 

728x90