쿠버네티스 Volume Snapshots — 볼륨 스냅샷과 복원
VolumeSnapshot·VolumeSnapshotContent·VolumeSnapshotClass 오브젝트, 스냅샷 생성/복원 흐름, deletionPolicy, 크로스 네임스페이스 복원을 설명합니다.
지난 글에서 CSI 드라이버의 아키텍처와 볼륨 생애주기를 살펴봤습니다. 이번에는 CSI 드라이버가 제공하는 강력한 기능인 Volume Snapshots — 볼륨의 특정 시점 상태를 캡처하고 복원하는 메커니즘을 다룹니다. 데이터베이스 백업, 블루/그린 배포, 재해 복구의 기반이 됩니다.
Volume Snapshots란?
쿠버네티스의 Volume Snapshots는 PVC의 특정 시점(point-in-time) 복사본을 만드는 기능입니다. 클라우드 제공자의 스냅샷 API(AWS EBS Snapshot, GCE Persistent Disk Snapshot 등)를 쿠버네티스 네이티브 오브젝트로 추상화합니다.
핵심은 세 가지 API 오브젝트입니다:
- VolumeSnapshotClass: 어떤 드라이버로, 어떤 정책으로 스냅샷을 만들지 정의 (StorageClass와 유사)
- VolumeSnapshot: 사용자가 생성하는 스냅샷 요청 (PVC와 유사)
- VolumeSnapshotContent: 실제 스냅샷 메타데이터 (PV와 유사)
VolumeSnapshotClass
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
name: csi-aws-vsc
annotations:
snapshot.storage.kubernetes.io/is-default-class: "true"
driver: ebs.csi.aws.com
deletionPolicy: Delete # 또는 Retain
parameters:
csi.storage.k8s.io/snapshotter-secret-name: aws-secret
csi.storage.k8s.io/snapshotter-secret-namespace: kube-system
deletionPolicy: Retain으로 설정하면 VolumeSnapshot 오브젝트를 삭제해도 실제 클라우드 스냅샷이 삭제되지 않습니다. 중요한 데이터의 스냅샷은 Retain을 권장합니다.
스냅샷 생성
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
name: db-snapshot-20260605
namespace: production
spec:
volumeSnapshotClassName: csi-aws-vsc
source:
persistentVolumeClaimName: db-data # 스냅샷할 PVC
생성 후 ReadyToUse: true가 될 때까지 기다립니다.
# 스냅샷 상태 확인
kubectl get volumesnapshot db-snapshot-20260605 -n production
# NAME READYTOUSE SOURCEPVC RESTORESIZE ...
# db-snapshot-20260605 true db-data 20Gi
# 상세 정보
kubectl describe volumesnapshot db-snapshot-20260605 -n production
스냅샷에서 PVC 복원
스냅샷에서 새 PVC를 생성할 때 dataSource에 VolumeSnapshot을 참조합니다.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: db-data-restored
namespace: production
spec:
dataSource:
name: db-snapshot-20260605
kind: VolumeSnapshot
apiGroup: snapshot.storage.k8s.io
accessModes:
- ReadWriteOnce
storageClassName: gp3
resources:
requests:
storage: 20Gi # 원본 크기 이상이어야 함
복원된 PVC를 기존 Pod에 마운트하거나, 새 Pod를 만들어 데이터를 검증할 수 있습니다.
기존 클라우드 스냅샷 임포트
쿠버네티스 외부에서 만든 스냅샷(예: 콘솔에서 직접 생성한 EBS 스냅샷)을 임포트하려면 VolumeSnapshotContent를 먼저 수동 생성합니다.
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotContent
metadata:
name: imported-snap
spec:
deletionPolicy: Retain
driver: ebs.csi.aws.com
source:
snapshotHandle: snap-0abc123456789def0 # 기존 AWS 스냅샷 ID
volumeSnapshotRef:
name: imported-snap-claim
namespace: production
---
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
name: imported-snap-claim
namespace: production
spec:
source:
volumeSnapshotContentName: imported-snap # VSC 직접 참조
VolumeSnapshotContent의 boundVolumeSnapshotContentName
VolumeSnapshot을 생성하면 컨트롤러가 자동으로 VolumeSnapshotContent를 생성하고 두 오브젝트를 서로 바인딩합니다. PV-PVC 관계와 동일한 패턴입니다.
# VolumeSnapshotContent 확인
kubectl get volumesnapshotcontent
# NAME READYTOUSE RESTORESIZE DRIVER
# snapcontent-abc123... true 20Gi ebs.csi.aws.com
스냅샷 스케줄링
쿠버네티스는 스냅샷 스케줄링을 네이티브로 지원하지 않습니다. 외부 도구를 사용합니다.
# CronJob으로 스냅샷 주기 생성
apiVersion: batch/v1
kind: CronJob
metadata:
name: db-snapshot-cron
spec:
schedule: "0 2 * * *" # 매일 새벽 2시
jobTemplate:
spec:
template:
spec:
serviceAccountName: snapshot-sa
containers:
- name: snapshot
image: bitnami/kubectl:latest
command:
- /bin/sh
- -c
- |
kubectl create -f - <<EOF
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
name: db-snap-$(date +%Y%m%d)
namespace: production
spec:
volumeSnapshotClassName: csi-aws-vsc
source:
persistentVolumeClaimName: db-data
EOF
프로덕션에서는 Velero, Kasten K10 같은 전문 백업 도구를 사용하는 것을 권장합니다.
Volume Cloning
스냅샷 없이 기존 PVC를 복사할 수도 있습니다(dataSource에 PVC를 참조).
spec:
dataSource:
name: source-pvc
kind: PersistentVolumeClaim
# 동일 네임스페이스, 동일 StorageClass, 동일 크기 이상
PVC Cloning은 스냅샷보다 빠르지만 동일 클러스터·네임스페이스·StorageClass 제약이 있습니다.
지난 글: 쿠버네티스 CSI 드라이버 — Container Storage Interface 완전 이해
다음 글: 쿠버네티스 Local Persistent Volume — 노드 로컬 스토리지 활용
읽어주셔서 감사합니다. 😊