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