K8s Velero 백업·복구 운영

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 전략이 완성됩니다.

위로 스크롤
WordPress Appliance - Powered by TurnKey Linux