쿠버네티스 환경에서는 Pod이 재시작되거나 다른 노드로 이동하더라도 데이터가 유지되어야 하는 경우가 많습니다.
이를 위해 PersistentVolume(PV)와 PersistentVolumeClaim(PVC)를 활용하여 데이터를 지속적으로 보관하고, 필요할 때 다른 Pod에서도 동일한 데이터를 사용할 수 있도록 구성하는 방법을 다룹니다.
이 글에서는 PVC를 이용한 데이터 지속성 보장과 볼륨 마이그레이션 전략을 소개합니다.
📌 글에서 다루는 상황들
1. PersistentVolumeClaim(PVC)를 활용하여 데이터를 유지하는 방법
2. Pod이 다른 노드에서 실행될 때 기존 데이터를 유지하는 방법
3. 볼륨 마이그레이션을 활용하여 스토리지 백엔드를 변경하는 방법
각 문제를 실무에서 바로 활용할 수 있도록 Manifest 템플릿과 예상 결과 값을 제공합니다.
1️⃣ PersistentVolumeClaim(PVC)를 활용하여 데이터를 유지하는 방법
❓ 문제 상황
운영팀에서 애플리케이션이 로그 파일을 저장하고 있어 Pod이 재시작되더라도 로그가 유지되어야 합니다.
이를 위해 PVC를 사용하여 지속적인 볼륨을 제공해야 합니다.
• PVC 이름: log-storage
• 볼륨 크기: 2Gi
• StorageClass: manual
• Pod에서 /var/log/app에 마운트
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. PersistentVolume(PV) 및 PersistentVolumeClaim(PVC)를 생성하여 Pod이 데이터를 저장할 수 있도록 합니다.
2. PVC를 Pod에 마운트하여 재시작 시에도 동일한 데이터를 사용할 수 있도록 합니다.
✅ 정답 Manifest (PV 및 PVC 설정)
🔹 PersistentVolume 생성
apiVersion: v1
kind: PersistentVolume
metadata:
name: log-pv
spec:
capacity:
storage: 2Gi # 볼륨 크기
accessModes:
- ReadWriteOnce # 한 개의 Pod에서만 읽기/쓰기 가능
persistentVolumeReclaimPolicy: Retain # Pod 삭제 후에도 데이터 유지
storageClassName: manual
hostPath:
path: "/mnt/data" # 노드의 특정 경로를 사용
🔹 PersistentVolumeClaim 생성
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: log-storage
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi
storageClassName: manual
🔹 PVC를 사용하는 Pod 생성
apiVersion: v1
kind: Pod
metadata:
name: log-pod
spec:
containers:
- name: log-container
image: busybox
command: ["/bin/sh", "-c", "echo '로그 데이터 유지됨' >> /var/log/app/log.txt && sleep 3600"]
volumeMounts:
- mountPath: "/var/log/app"
name: log-volume
volumes:
- name: log-volume
persistentVolumeClaim:
claimName: log-storage
📌 적용 후 예상 결과 값
1. PVC가 정상적으로 바인딩되었는지 확인
kubectl get pvc
💡 예상 출력 값
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
log-storage Bound log-pv 2Gi RWO manual 5s
2. Pod이 생성된 후 데이터가 유지되는지 확인
kubectl exec log-pod -- cat /var/log/app/log.txt
💡 예상 출력 값
로그 데이터 유지됨
✅ Pod이 재시작되어도 데이터가 유지됨
2️⃣ Pod이 다른 노드에서 실행될 때 기존 데이터를 유지하는 방법
❓ 문제 상황
운영팀에서 Pod이 다른 노드로 이동하더라도 기존 데이터를 유지해야 합니다.
이를 위해 NFS(Network File System) 기반의 PersistentVolume을 사용하여 여러 노드에서도 동일한 볼륨을 사용할 수 있도록 설정해야 합니다.
• StorageClass: nfs
• PersistentVolume이 모든 노드에서 접근 가능해야 함
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. NFS 서버를 설정하여 여러 노드에서 동일한 데이터를 사용할 수 있도록 합니다.
2. PersistentVolume을 NFS 스토리지로 설정하고, PVC를 사용하여 마운트합니다.
✅ 정답 Manifest (NFS 기반 PV 및 PVC 설정)
🔹 NFS PersistentVolume 생성
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany # 여러 Pod에서 읽기/쓰기 가능
persistentVolumeReclaimPolicy: Retain
storageClassName: nfs
nfs:
server: 192.168.1.100 # NFS 서버 IP
path: "/mnt/nfs"
🔹 PersistentVolumeClaim 생성
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-storage
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
storageClassName: nfs
✅ 이제 Pod이 어느 노드에서 실행되더라도 데이터를 유지할 수 있음
3️⃣ 볼륨 마이그레이션을 활용하여 스토리지 백엔드를 변경하는 방법
❓ 문제 상황
운영팀에서 기존에 사용하던 로컬 스토리지(PV)를 클라우드 기반 스토리지로 변경해야 합니다.
Pod이 중단 없이 새로운 PersistentVolume으로 데이터를 마이그레이션할 수 있도록 설정해야 합니다.
• 기존 PV: log-pv (로컬 스토리지)
• 신규 PV: cloud-pv (클라우드 블록 스토리지)
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. 새로운 PersistentVolume을 생성하고, 기존 PVC가 이를 사용하도록 변경합니다.
2. kubectl patch 명령어를 사용하여 기존 PVC를 새로운 PV로 마이그레이션합니다.
✅ 볼륨 마이그레이션 절차
1. 새로운 PV 생성 (클라우드 스토리지)
apiVersion: v1
kind: PersistentVolume
metadata:
name: cloud-pv
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
storageClassName: cloud-storage
gcePersistentDisk:
pdName: cloud-disk
fsType: ext4
2. PVC를 새로운 PV로 마이그레이션
kubectl patch pvc log-storage -p '{"spec":{"volumeName":"cloud-pv"}}'
💡 예상 출력 값
persistentvolumeclaim/log-storage patched
✅ 스토리지 백엔드 변경이 완료되었으며, Pod이 새로운 스토리지로 데이터를 유지함