본문 바로가기
배포·CI,CD·클라우드

Velero로 Kubernetes 백업·복구: S3/MinIO 연동, PV 스냅샷, 네임스페이스 단위 복원

by yamoojin83 2025. 11. 2.

Velero로 Kubernetes 백업·복구: S3/MinIO 연동, PV 스냅샷, 네임스페이스 단위 복원

클러스터를 오래 운영하다 보면 “사람이 한 번쯤은 실수한다”는 가정이 현실이 됩니다. 잘못된 kubectl delete, 장애로 인한 PV 손상, 혹은 잘못된 배포 롤아웃 등. Velero는 Kubernetes 리소스(YAML)와 볼륨 데이터를 함께 백업하고, 필요한 스코프(전체/네임스페이스/레이블 선택)로 빠르게 복원할 수 있게 도와줍니다. 이 글은 Ubuntu 24.04 + K8s(1.28+) 기준으로 S3/MinIO 연동, 스냅샷/파일단위 백업(Restic/FSB), 테스트 복원까지 한 번에 구성합니다.


1) 무엇을 백업하나?

  • 리소스: Deployment/Service/Ingress/CRD/Secrets/ConfigMap 등 클러스터 상태
  • 데이터: PersistentVolumeClaim(PVC) 안의 파일들(애플리케이션 데이터)

Velero는 리소스는 API 스냅샷으로, 데이터는 볼륨 스냅샷 또는 파일 단위(Restic/FSB)로 백업합니다. 클라우드에서는 CSI 스냅샷이 이상적이고, 온프레미스/미니오 환경에서는 파일단위가 범용적입니다.


2) 사전 준비: S3 호환 스토리지

운영 계정과 버킷을 준비합니다(예시는 MinIO, AWS S3도 동일하게 적용 가능).

# MinIO 예시
mc alias set local http://minio.example:9000 ACCESS_KEY SECRET_KEY
mc mb local/velero-backups
mc ilm add local/velero-backups --expire-days 30   # 30일 보관 정책(선택)

3) Velero 설치(Helm) + 백업 위치 설정

helm repo add vmware-tanzu https://vmware-tanzu.github.io/helm-charts
helm repo update
kubectl create ns velero

values.yaml 최소 예시:

# values.yaml
configuration:
  backupStorageLocation:
    - name: default
      provider: aws
      bucket: velero-backups
      prefix: cluster-a
      default: true
      accessMode: ReadWrite
      config:
        region: ap-northeast-2
        s3ForcePathStyle: "true"
        s3Url: http://minio.example:9000
  volumeSnapshotLocation:
    - name: default
      provider: aws
      config:
        region: ap-northeast-2

credentials:
  useSecret: true
  name: cloud-credentials
  secretContents:
    cloud: |
      [default]
      aws_access_key_id=ACCESS_KEY
      aws_secret_access_key=SECRET_KEY

initContainers: []   # 필요시 CSI 플러그인 선로딩
snapshotsEnabled: false   # 파일단위(RESTIC/FSB) 위주면 false로 시작
deployRestic: true        # Velero 1.12 기준: node-agent(예전 restic) 설치용

설치:

helm install velero vmware-tanzu/velero -n velero -f values.yaml
kubectl -n velero get pods

참고: 클라우드 CSI 스냅샷을 쓰려면 snapshotsEnabled: true 및 해당 CSI 스냅샷 CRD/컨트롤러가 필요합니다. 온프레미스/범용 구성에서는 node-agent(restic)가 간편합니다.


4) 어떤 볼륨을 파일단위로 백업할지 표시(주석)

파일단위 백업을 사용하려면 pod에 어노테이션을 추가합니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: order-api
  namespace: prod
spec:
  template:
    metadata:
      annotations:
        backup.velero.io/backup-volumes: app-data   # pod 내 볼륨 이름
    spec:
      volumes:
        - name: app-data
          persistentVolumeClaim:
            claimName: order-api-pvc

여러 볼륨이면 콤마로 구분: backup.velero.io/backup-volumes: data,uploads


5) 첫 백업 만들기(전체/네임스페이스/레이블 선택)

# 5-1) 전체 클러스터 리소스 + 파일단위 볼륨
velero backup create full-$(date +%F) \
  --include-cluster-resources=true \
  --wait

# 5-2) 특정 네임스페이스만
velero backup create ns-prod-$(date +%F) \
  --include-namespaces prod \
  --wait

# 5-3) 레이블 셀렉터 기반(예: app=order-api)
velero backup create app-order-api-$(date +%F) \
  --selector app=order-api \
  --wait

상태 확인:

velero backup get
velero backup describe ns-prod-2025-10-21 --details

6) 스케줄(자동 백업) 설정

# 매일 새벽 3시, 14일 보관
velero schedule create daily-3am \
  --schedule="0 3 * * *" \
  --ttl 336h    # 14일

# 매시간, 48시간 보관(테스트용)
velero schedule create hourly \
  --schedule="0 * * * *" \
  --ttl 48h

7) 복원 시나리오(리허설이 진짜 복원이다)

7-1) 동일 클러스터/다른 네임스페이스로 복원(드릴런)

# 예: prod 데이터/리소스를 staging-restore로 안전 복사
kubectl create ns staging-restore

# 리소스 이름 충돌을 피하려면 label/transform 사용(간단 예시는 그대로 복원)
velero restore create drill-restore \
  --from-backup ns-prod-2025-10-21 \
  --namespace-mappings prod:staging-restore \
  --wait

7-2) 특정 리소스만 복원

# 실수로 지운 Secret만 복원
velero restore create secret-restore \
  --from-backup ns-prod-2025-10-21 \
  --include-resources secrets \
  --selector app=order-api \
  --wait

7-3) 다른 클러스터로 이관(재해복구)

목표 클러스터에도 Velero를 같은 S3 위치로 설치하고, 동일한 bucket/prefix를 바라보게 하면 velero backup get으로 목록을 불러와 restore를 실행할 수 있습니다. StorageClass가 다를 경우 --restore-volumes=false로 리소스만 먼저 복원한 뒤 PVC 재맵핑을 수행하세요.


8) 볼륨 복원 전략(파일단위 vs 스냅샷)

  • 파일단위(node-agent/restic): 범용/저비용. 대용량은 복구 시간이 더 걸릴 수 있음.
  • CSI 스냅샷: 빠른 복구, 스토리지 드라이버 의존. 클라우드/지원 스토리지에서 추천.

혼합도 가능합니다. 핵심 데이터베이스 PVC는 스냅샷, 업로드/캐시는 파일단위처럼 운영 특성에 맞춰 선택하세요.


9) 보안/비용/보관 정책

  • 암호화: S3 SSE(서버측 암호화) 또는 KMS 키 사용. MinIO도 SSE-S3/SSE-KMS 지원.
  • 보관기간: --ttl·버킷 ILM로 층별 보관(핫 7일, 콜드 30일 등).
  • 네트워크: 백업 트래픽은 내부망/전용 엔드포인트로 제한(UFW/보안그룹).
  • 접근제어: Velero 자격 증명은 필요 최소 권한(버킷/프리픽스 한정)으로 발급.

10) 운영 점검표(복붙)

  • 버킷 접근/권한 OK (리스트/쓰기/삭제)
  • 백업 1회 수동 실행 & describe --details 확인
  • 스케줄 등록(하루/시간 단위) & ttl 지정
  • 드릴 복원: 다른 네임스페이스로 주 1회 리허설
  • 중요 워크로드 PVC는 스냅샷/파일단위 중 전략 결정
  • 대시보드/알림: 실패 이벤트를 Slack/Alertmanager로 통보

11) 자주 겪는 문제와 빠른 해결

  • BackupStorageLocation NotReady: s3Url·DNS·방화벽·액세스키 재확인, 버킷/프리픽스 오타 점검.
  • PV 복원 실패: StorageClass 불일치 → --restore-volumes=false로 리소스 먼저 복원, PVC/SC 매핑 후 볼륨 복원.
  • 파일단위 백업 누락: pod 주석 backup.velero.io/backup-volumes에 볼륨 이름 일치 여부 확인.
  • 용량 과다: ttl 단축, 불필요 네임스페이스 제외, 로그/캐시 PVC는 백업 대상에서 제외.

마무리

백업은 “있는가”가 아니라 “복원되는가”가 기준입니다. Velero로 리소스+데이터를 함께 잡고, 정기 스케줄과 드릴 복원을 루틴화하세요. 장애 때 당황하지 않도록, 오늘 바로 작은 네임스페이스 하나로 백업→복원 리허설부터 시작하면 됩니다.