26Z26a

QK·2026년 8월 26일

Kubernetes에서 기존 PVC의 데이터를 백업하고 이를 기반으로 새로운 PVC를 생성하는 방법은 크게 두 가지입니다.

  1. 볼륨 스냅샷(VolumeSnapshot) 방식: 클라우드/CSI 스토리지를 사용할 때 가장 빠르고 표준적인 방식
  2. 임시 Pod(rsync/tar) 방식: 스냅샷 CSI가 없거나 NFS, 로컬 볼륨 등 파일 단위 복사가 필요할 때 범용적인 방식

방법 1. CSI VolumeSnapshot을 이용한 백업 및 복원 (권장)

스토리지 클래스가 CSI 스냅샷(VolumeSnapshotClass)을 지원하는 경우 사용하는 가장 안전한 방법입니다.

전(前) 절차: 데이터 일관성 확보 및 스냅샷 생성

  1. Pod 쓰기 작업 중지 (선택/권장): 데이터 정합성을 위해 대상 워크로드를 일시 정지하거나 scale을 0으로 조정합니다.
kubectl scale deployment <APP_NAME> -n <NAMESPACE> --replicas=0
  1. VolumeSnapshot 생성:
# snapshot.yaml
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: backup-pvc-snapshot
  namespace: <NAMESPACE>
spec:
  volumeSnapshotClassName: <CSI_SNAPSHOT_CLASS_NAME>
  source:
    persistentVolumeClaimName: <기존_PVC_이름>
kubectl apply -f snapshot.yaml
  1. 스냅샷 준비 상태 확인:
kubectl get volumesnapshot backup-pvc-snapshot -n <NAMESPACE>
# READYTOUSE 항목이 true가 될 때까지 대기

복원 절차: 스냅샷 기반의 새 PVC 생성

dataSource 필드에 방금 생성한 스냅샷을 지정합니다.

# new-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: <새로운_PVC_이름>
  namespace: <NAMESPACE>
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: <STORAGE_CLASS_NAME>
  resources:
    requests:
      storage: <기존과_같거나_더_큰_용량>
  dataSource:
    name: backup-pvc-snapshot
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io
kubectl apply -f new-pvc.yaml

후(後) 절차: 워크로드 재연결 및 검증

  1. 앱 배포 매니페스트(Deployment/StatefulSet)의 claimName<새로운_PVC_이름>으로 수정 후 적용합니다.
  2. 애플리케이션의 Pod를 다시 실행하고 내부 파일이 정상 복원되었는지 확인합니다.

방법 2. 임시 Pod(rsync)를 이용한 데이터 직접 복사

CSI 스냅샷을 지원하지 않는 환경에서 두 PVC를 하나의 임시 Pod에 동시 마운트하여 데이터를 복사하는 방법입니다.

전(前) 절차: 새 PVC 생성 및 원본 Pod 중지

  1. 데이터 복사 대상이 될 신규 빈 PVC를 먼저 생성합니다.
# new-empty-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: <새로운_PVC_이름>
  namespace: <NAMESPACE>
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: <STORAGE_CLASS_NAME>
  resources:
    requests:
      storage: <기존_용량>
kubectl apply -f new-empty-pvc.yaml
  1. 기존 PVC를 사용 중인 Pod를 정지합니다.
kubectl scale deployment <APP_NAME> -n <NAMESPACE> --replicas=0

복원(복사) 절차: 임시 마이그레이션 Pod 실행

기존 PVC와 새 PVC를 모두 마운트하는 임시 Pod를 띄워 rsync 또는 cp로 복제합니다.

# migration-job.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pvc-migration-pod
  namespace: <NAMESPACE>
spec:
  restartPolicy: Never
  volumes:
    - name: src-vol
      persistentVolumeClaim:
        claimName: <기존_PVC_이름>
    - name: dst-vol
      persistentVolumeClaim:
        claimName: <새로운_PVC_이름>
  containers:
    - name: sync
      image: alpine:latest
      command: ["/bin/sh", "-c"]
      args:
        - |
          apk add --no-cache rsync
          echo "Starting data copy..."
          rsync -avzh /source/ /destination/
          echo "Data copy completed successfully."
      volumeMounts:
        - mountPath: /source
          name: src-vol
        - mountPath: /destination
          name: dst-vol
# 복사 작업 실행
kubectl apply -f migration-job.yaml

# 복사 로그 확인
kubectl logs -f pvc-migration-pod -n <NAMESPACE>

후(後) 절차: 정리 및 신규 PVC 연결

  1. 임시 마이그레이션 Pod 삭제:
kubectl delete pod pvc-migration-pod -n <NAMESPACE>
  1. 워크로드 PVC 이름 변경 및 배포:
    애플리케이션 Pod/Deployment의 마운트 설정을 <새로운_PVC_이름>으로 변경하고 실행합니다.
kubectl scale deployment <APP_NAME> -n <NAMESPACE> --replicas=1
profile
engineer

0개의 댓글