Velero란?
Velero는 Kubernetes 클러스터의 리소스와 Persistent Volume을 백업·복구·마이그레이션하는 오픈소스 도구입니다. VMware에서 시작해 현재 CNCF Sandbox 프로젝트로, 재해 복구(DR), 클러스터 마이그레이션, 네임스페이스 단위 스냅샷 등 프로덕션 운영에 필수적인 백업 인프라를 제공합니다.
아키텍처
| 컴포넌트 | 역할 |
|---|---|
| Velero Server | 클러스터 내 컨트롤러 — Backup/Restore CRD 처리 |
| velero CLI | 백업/복구 명령 실행 |
| BackupStorageLocation | S3/GCS/Azure Blob 등 오브젝트 스토리지 |
| VolumeSnapshotLocation | EBS/PD 스냅샷 위치 |
| Node Agent (Restic/Kopia) | 파일 레벨 PV 백업 (CSI 스냅샷 미지원 시) |
설치 — Helm
# AWS S3 + EBS 스냅샷 기준
helm repo add vmware-tanzu https://vmware-tanzu.github.io/helm-charts
helm install velero vmware-tanzu/velero
--namespace velero --create-namespace
--set configuration.backupStorageLocation[0].name=default
--set configuration.backupStorageLocation[0].provider=aws
--set configuration.backupStorageLocation[0].bucket=my-velero-backups
--set configuration.backupStorageLocation[0].config.region=ap-northeast-2
--set configuration.volumeSnapshotLocation[0].name=default
--set configuration.volumeSnapshotLocation[0].provider=aws
--set configuration.volumeSnapshotLocation[0].config.region=ap-northeast-2
--set initContainers[0].name=velero-plugin-for-aws
--set initContainers[0].image=velero/velero-plugin-for-aws:v1.10.0
--set initContainers[0].volumeMounts[0].mountPath=/target
--set initContainers[0].volumeMounts[0].name=plugins
--set credentials.useSecret=true
--set credentials.secretContents.cloud="[default]naws_access_key_id=AKIAXXXXnaws_secret_access_key=XXXX"
--set deployNodeAgent=true
--set nodeAgent.podVolumePath=/var/lib/kubelet/pods
백업 전략
네임스페이스 단위 백업
# production 네임스페이스 전체 백업
velero backup create prod-backup-20260308
--include-namespaces production
--snapshot-volumes=true
--ttl 720h # 30일 보존
# 특정 리소스만 백업
velero backup create db-config-backup
--include-namespaces production
--include-resources configmaps,secrets,persistentvolumeclaims
--ttl 2160h # 90일 보존
# 레이블 셀렉터로 필터링
velero backup create app-backup
--selector app=my-api
--snapshot-volumes=true
스케줄 백업 — 자동화
# CRD로 스케줄 정의
apiVersion: velero.io/v1
kind: Schedule
metadata:
name: daily-production
namespace: velero
spec:
schedule: "0 2 * * *" # 매일 새벽 2시
template:
includedNamespaces:
- production
- staging
excludedResources:
- events
- events.events.k8s.io
snapshotVolumes: true
ttl: 720h # 30일 보존
storageLocation: default
volumeSnapshotLocations:
- default
useOwnerReferencesInBackup: false
---
# 주간 전체 클러스터 백업
apiVersion: velero.io/v1
kind: Schedule
metadata:
name: weekly-full-cluster
namespace: velero
spec:
schedule: "0 3 * * 0" # 매주 일요일 새벽 3시
template:
excludedNamespaces:
- kube-system
- velero
excludedResources:
- events
- nodes
snapshotVolumes: true
ttl: 4320h # 180일 보존
복구 (Restore)
# 전체 복구
velero restore create --from-backup prod-backup-20260308
# 특정 네임스페이스만 복구
velero restore create --from-backup prod-backup-20260308
--include-namespaces production
# 다른 네임스페이스로 복구 (네임스페이스 매핑)
velero restore create --from-backup prod-backup-20260308
--namespace-mappings production:staging-restore
# 특정 리소스만 복구
velero restore create --from-backup prod-backup-20260308
--include-resources deployments,services,configmaps
--restore-volumes=false
# 기존 리소스 충돌 정책
velero restore create --from-backup prod-backup-20260308
--existing-resource-policy=update # 기존 리소스 업데이트
CSI 스냅샷 vs Restic/Kopia
| 방식 | CSI 스냅샷 | Kopia (File-Level) |
|---|---|---|
| 속도 | 빠름 (블록 레벨) | 느림 (파일 스캔) |
| 클라우드 의존 | EBS/PD 스냅샷 API 필요 | 어디서든 동작 |
| 크로스 클라우드 | 불가 | 가능 (S3 호환) |
| 증분 백업 | 스냅샷 체인 | 중복 제거 기반 |
| 설정 | CSI 드라이버 필요 | Pod 어노테이션만 |
# Kopia(Restic) 파일 백업 — Pod 어노테이션
apiVersion: v1
kind: Pod
metadata:
annotations:
backup.velero.io/backup-volumes: data,logs # 백업할 볼륨 지정
backup.velero.io/backup-volumes-excludes: tmp # 제외할 볼륨
spec:
containers:
- name: app
volumeMounts:
- name: data
mountPath: /app/data
- name: logs
mountPath: /app/logs
- name: tmp
mountPath: /tmp
클러스터 마이그레이션
Velero의 강력한 활용 사례 중 하나는 클러스터 간 마이그레이션입니다.
# 소스 클러스터에서 백업
velero backup create migration-backup
--include-namespaces app-namespace
--snapshot-volumes=false # Kopia로 파일 백업 (크로스 클라우드)
# 대상 클러스터에서 같은 S3 버킷 연결 후 복구
# 1. Velero 설치 (같은 BackupStorageLocation)
# 2. 백업 목록 확인
velero backup get
# 3. 복구 실행
velero restore create --from-backup migration-backup
# StorageClass 매핑 (소스: gp2 → 대상: gp3)
velero restore create --from-backup migration-backup
--storage-class-mappings gp2:gp3
Backup Hook — 일관성 보장
데이터베이스처럼 백업 전 정합성 확보가 필요한 경우 Hook을 사용합니다.
apiVersion: v1
kind: Pod
metadata:
annotations:
# 백업 전: DB 쓰기 잠금
pre.hook.backup.velero.io/container: postgres
pre.hook.backup.velero.io/command: '["/bin/bash", "-c", "PGPASSWORD=$POSTGRES_PASSWORD pg_dump -U postgres mydb > /backup/dump.sql"]'
pre.hook.backup.velero.io/timeout: 120s
# 백업 후: 잠금 해제 (필요시)
post.hook.backup.velero.io/container: postgres
post.hook.backup.velero.io/command: '["/bin/bash", "-c", "echo backup done"]'
# 복구 후 Hook
post.hook.restore.velero.io/container: postgres
post.hook.restore.velero.io/command: '["/bin/bash", "-c", "PGPASSWORD=$POSTGRES_PASSWORD psql -U postgres mydb < /backup/dump.sql"]'
post.hook.restore.velero.io/wait-timeout: 5m
모니터링과 알림
# 백업 상태 확인
velero backup get
velero backup describe prod-backup-20260308 --details
# 복구 로그 확인
velero restore logs migration-restore
# Prometheus 메트릭 (Velero 내장)
# velero_backup_success_total
# velero_backup_failure_total
# velero_backup_duration_seconds
# velero_restore_success_total
# Grafana 대시보드와 연동
# AlertManager 규칙 예시
- alert: VeleroBackupFailed
expr: increase(velero_backup_failure_total[24h]) > 0
for: 5m
annotations:
summary: "Velero 백업 실패 감지"
Grafana 대시보드로 백업 성공률, 소요 시간, 스토리지 사용량을 시각화하면 DR 준비 상태를 상시 모니터링할 수 있습니다.
운영 팁
- 정기 복구 테스트: 월 1회 이상 별도 네임스페이스에 복구 테스트 실행 — 백업만 있고 복구 못하면 무의미
- S3 버전 관리: BackupStorageLocation 버킷에 버전 관리 활성화로 실수 방지
- 암호화: S3 SSE-KMS 또는 Kopia의 자체 암호화로 백업 데이터 보호
- 리소스 제외:
events,nodes,endpoints등 불필요한 리소스 제외로 백업 크기 절감 - External Secrets 연동: Velero credential을 External Secrets로 관리해 키 로테이션 자동화
정리
Velero는 Kubernetes 재해 복구의 표준 도구입니다. 스케줄 백업으로 자동화하고, CSI 스냅샷과 Kopia를 상황에 맞게 조합하며, Hook으로 데이터 일관성을 보장합니다. 백업은 항상 존재하되, 진짜 중요한 것은 복구 테스트입니다 — 정기적으로 복구를 검증해야 DR 전략이 완성됩니다.