Kubernetes/Kubernetes Best Practices

[Scenario Playbook Ep.37] 🚀 PersistentVolume 편 #4 | StatefulSet과 함께 PersistentVolume 사용

ygtoken 2025. 3. 16. 18:50
728x90

 

쿠버네티스에서 StatefulSet은 각 Pod에 고유한 볼륨을 제공해야 하는 경우 유용합니다.

이번 글에서는 StatefulSet을 활용하여 각 Pod에 독립적인 PersistentVolume을 제공하는 방법을 다룹니다.

 


📌 글에서 다루는 상황들

 

1️⃣ StatefulSet에서 Pod별 개별 볼륨 사용 설정

2️⃣ VolumeClaimTemplates을 활용한 자동 볼륨 생성

 

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

 


1️⃣ StatefulSet에서 Pod별 개별 볼륨 사용 설정

 

❓ 문제 상황

 

운영팀에서 각 Pod이 독립적인 스토리지를 가져야 하는 애플리케이션을 배포해야 하는 요구사항이 생겼습니다.

예를 들어 데이터베이스 클러스터와 같은 서비스에서는 각 Pod이 개별적인 데이터를 저장하고 관리해야 합니다.

stateful-db라는 StatefulSet을 생성해야 합니다.

각 Pod이 독립적인 PersistentVolume을 가질 수 있도록 설정해야 합니다.

볼륨 크기는 5Gi로 설정해야 합니다.

 

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

 


🛠️ 해결 방법

 

1. StatefulSet을 생성할 때, 각 Pod이 독립적인 PersistentVolume을 사용하도록 VolumeClaimTemplates를 설정해야 합니다.

volumeClaimTemplates → 각 Pod에 개별 PVC를 자동 생성

 

2. StatefulSet이 실행된 후, 각 Pod에 별도의 볼륨이 생성되는지 확인해야 합니다.

 


✅ 정답 Manifest (StatefulSet에서 Pod별 볼륨 생성 설정)

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: stateful-db  # StatefulSet 이름
spec:
  serviceName: "stateful-db"
  replicas: 3  # 3개의 Pod 생성
  selector:
    matchLabels:
      app: stateful-db
  template:
    metadata:
      labels:
        app: stateful-db
    spec:
      containers:
      - name: database
        image: postgres:13  # PostgreSQL 이미지
        env:
        - name: POSTGRES_DB
          value: "appdb"
        - name: POSTGRES_USER
          value: "user"
        - name: POSTGRES_PASSWORD
          value: "password"
        volumeMounts:
        - name: db-storage
          mountPath: "/var/lib/postgresql/data"
  volumeClaimTemplates:
  - metadata:
      name: db-storage  # PVC 이름
    spec:
      accessModes:
        - ReadWriteOnce  # 각 Pod이 독립적인 볼륨 사용
      resources:
        requests:
          storage: 5Gi  # 요청하는 스토리지 크기

 

 


📌 적용 후 예상 결과 값

 

1. StatefulSet 및 PVC 생성 확인

kubectl get statefulset
kubectl get pvc

 

💡 예상 출력 값

NAME           READY   AGE
stateful-db    3/3     5s
NAME                 STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
db-storage-stateful-db-0   Bound    pvc-1234abcd-efgh-ijkl-5678          5Gi        RWO                           5s
db-storage-stateful-db-1   Bound    pvc-2234abcd-efgh-ijkl-6789          5Gi        RWO                           5s
db-storage-stateful-db-2   Bound    pvc-3234abcd-efgh-ijkl-7890          5Gi        RWO                           5s

 

 


2️⃣ VolumeClaimTemplates을 활용한 자동 볼륨 생성

 

❓ 문제 상황

 

운영팀에서 StatefulSet이 실행될 때, 각 Pod에 자동으로 PVC가 생성되도록 설정해야 하는 요구사항이 생겼습니다.

기본적으로 Deployment는 모든 Pod이 같은 PVC를 공유하지만, StatefulSet을 사용하면 Pod별로 PVC를 자동 생성할 수 있습니다.

StatefulSet이 실행될 때마다 새로운 PVC가 생성되어야 합니다.

각 Pod이 개별적인 볼륨을 유지해야 합니다.

 

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

 


🛠️ 해결 방법

 

1. StatefulSet에서 volumeClaimTemplates를 사용하여 Pod이 생성될 때마다 개별 PVC가 자동으로 생성되도록 설정해야 합니다.

volumeClaimTemplates → StatefulSet의 각 Pod에 개별 PVC 자동 생성

 

2. Pod을 삭제한 후 다시 생성해도 동일한 PVC를 유지하는지 확인해야 합니다.

 


✅ 정답 Manifest (VolumeClaimTemplates 활용한 StatefulSet 설정)

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: stateful-app
spec:
  serviceName: "stateful-app"
  replicas: 3
  selector:
    matchLabels:
      app: stateful-app
  template:
    metadata:
      labels:
        app: stateful-app
    spec:
      containers:
      - name: app-container
        image: nginx
        volumeMounts:
        - name: app-storage
          mountPath: "/app/data"
  volumeClaimTemplates:
  - metadata:
      name: app-storage
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 5Gi

 

 


📌 적용 후 예상 결과 값

 

1. PVC 자동 생성 확인

kubectl get pvc

 

💡 예상 출력 값

NAME                       STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
app-storage-stateful-app-0   Bound    pvc-aaa1abcd-efgh-ijkl-1111          5Gi        RWO                           5s
app-storage-stateful-app-1   Bound    pvc-bbb2abcd-efgh-ijkl-2222          5Gi        RWO                           5s
app-storage-stateful-app-2   Bound    pvc-ccc3abcd-efgh-ijkl-3333          5Gi        RWO                           5s

 

2. Pod 삭제 후 PVC가 유지되는지 확인

kubectl delete pod stateful-app-0
kubectl get pvc

 

💡 예상 출력 값

NAME                       STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
app-storage-stateful-app-0   Bound    pvc-aaa1abcd-efgh-ijkl-1111          5Gi        RWO                           10m
app-storage-stateful-app-1   Bound    pvc-bbb2abcd-efgh-ijkl-2222          5Gi        RWO                           10m
app-storage-stateful-app-2   Bound    pvc-ccc3abcd-efgh-ijkl-3333          5Gi        RWO                           10m
728x90