Kubernetes에서 기존 PVC의 데이터를 백업하고 이를 기반으로 새로운 PVC를 생성하는 방법은 크게 두 가지입니다.
스토리지 클래스가 CSI 스냅샷(VolumeSnapshotClass)을 지원하는 경우 사용하는 가장 안전한 방법입니다.
kubectl scale deployment <APP_NAME> -n <NAMESPACE> --replicas=0
# 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
kubectl get volumesnapshot backup-pvc-snapshot -n <NAMESPACE>
# READYTOUSE 항목이 true가 될 때까지 대기
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
claimName을 <새로운_PVC_이름>으로 수정 후 적용합니다.CSI 스냅샷을 지원하지 않는 환경에서 두 PVC를 하나의 임시 Pod에 동시 마운트하여 데이터를 복사하는 방법입니다.
# 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
kubectl scale deployment <APP_NAME> -n <NAMESPACE> --replicas=0
기존 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>
kubectl delete pod pvc-migration-pod -n <NAMESPACE>
<새로운_PVC_이름>으로 변경하고 실행합니다.kubectl scale deployment <APP_NAME> -n <NAMESPACE> --replicas=1