Kubernetes/Kubernetes Best Practices

[Scenario Playbook - 심화편 | Medium Level #4] PersistentVolumeClaim을 이용한 데이터 지속성 보장 및 마이그레이션

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

 

쿠버네티스 환경에서는 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이 새로운 스토리지로 데이터를 유지함

728x90