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로 리소스+데이터를 함께 잡고, 정기 스케줄과 드릴 복원을 루틴화하세요. 장애 때 당황하지 않도록, 오늘 바로 작은 네임스페이스 하나로 백업→복원 리허설부터 시작하면 됩니다.