쿠버네티스에서 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