본문으로 건너뛰기

Velero

Velero는 Kubernetes 클러스터의 백업, 복원, 재해 복구를 위한 오픈소스 도구입니다. Lumie 인프라에서 클러스터 리소스와 PVC 데이터를 MinIO에 백업합니다.

참고: PostgreSQL 데이터베이스 백업(WAL 아카이브 + 베이스백업)은 Velero가 아닌 CloudNativePG Barman이 직접 Cloudflare R2에 수행합니다. Velero의 주된 역할은 Kubernetes 리소스 메타데이터 및 비데이터베이스 PVC 백업입니다.

개요

주요 기능

기능설명
클러스터 백업Kubernetes 리소스 백업
PVC 백업파일시스템 레벨 볼륨 백업
재해 복구클러스터 전체 복원
스케줄 백업자동화된 정기 백업
선택적 복원네임스페이스/리소스별 복원

아키텍처


설치 및 구성

Helm 차트 설정

# Velero Server 설정
upgradeCRDs: false # CRD 업그레이드 작업 건너뛰기 (kubectl 이미지 종속성 방지)

image:
repository: zot.lumie-infra.com/velero/velero
tag: v1.17.2
pullPolicy: IfNotPresent

replicaCount: 1

resources:
requests:
cpu: 11m
memory: 140Mi
limits:
memory: 140Mi
# CPU 제한 없음 (안정성 우선)

AWS 플러그인 설정

initContainers:
- name: velero-plugin-for-aws
image: zot.lumie-infra.com/velero/velero-plugin-for-aws:v1.14.0
volumeMounts:
- mountPath: /target
name: plugins

MinIO는 S3 호환 API를 제공하므로 AWS 플러그인을 사용합니다.

Node Agent 설정

deployNodeAgent: true

nodeAgent:
podVolumePath: /var/lib/kubelet/pods
privileged: false # 특권 모드 비활성화 (보안 강화)
resources:
requests:
cpu: 15m
memory: 100Mi
limits:
memory: 100Mi

Node Agent는 각 노드에서 실행되어 PVC의 파일시스템 백업을 담당합니다.


백업 스토리지 설정

BackupStorageLocation

configuration:
backupStorageLocation:
- name: default
provider: aws
bucket: velero-backups
config:
region: minio
s3ForcePathStyle: "true"
s3Url: http://minio.minio.svc.cluster.local:9000

VolumeSnapshotLocation

configuration:
volumeSnapshotLocation:
- name: default
provider: aws
config:
region: minio

자격 증명 설정

credentials:
useSecret: true
existingSecret: velero-s3-credentials

자격 증명은 Vault Static Secret을 통해 관리됩니다:

# Vault Static Secret 설정
vaultStaticSecrets:
- name: minio-vss
path: infrastructure/minio
destination:
name: velero-s3-credentials
transformation:
templates:
cloud: |
[default]
aws_access_key_id={{ .Secrets.MINIO_ROOT_USER }}
aws_secret_access_key="{{ .Secrets.MINIO_ROOT_PASSWORD }}"

백업 정책

기본 설정

configuration:
defaultBackupTTL: 168h # 7일 보존
defaultVolumesToFsBackup: true # 모든 PV를 파일시스템 백업
restoreOnlyMode: false

백업 제외 설정

# 백업 검증 비활성화 (수동 백업만 사용)
storeValidationFrequency: 0s
backupSyncPeriod: 0s

ArgoCD 동기화 트리거를 방지하기 위해 자동 검증을 비활성화합니다.

모니터링 설정

metrics:
enabled: true
serviceMonitor:
enabled: true
prometheusRule:
enabled: false # Prometheus Rule 자동 생성 비활성화

Velero UI

UI 설정

# Velero UI Helm Values
image:
repository: zot.lumie-infra.com/otwld/velero-ui
tag: "0.10.1"
pullPolicy: IfNotPresent

replicaCount: 1

resources:
requests:
cpu: 15m
memory: 256Mi
limits:
memory: 256Mi

service:
type: ClusterIP
port: 3000

env:
- name: BASIC_AUTH_ENABLED
value: "false"

podSecurityContext:
runAsNonRoot: true
runAsUser: 1000
fsGroup: 1000

securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: false

serviceAccount:
create: true
name: velero-ui

접근 방법

  • 내부: velero-ui.velero.svc.cluster.local:3000
  • 외부: Teleport Web App 터널

공개 인그레스는 보안상 비활성화되어 있습니다.


백업 작업

수동 백업

전체 클러스터 백업

# 모든 리소스 백업
velero backup create full-backup-$(date +%Y%m%d-%H%M%S)

# 특정 네임스페이스 백업
velero backup create lumie-backup \
--include-namespaces lumie-dev,lumie-prod

# 특정 리소스 타입 백업
velero backup create config-backup \
--include-resources configmaps,secrets

PVC 백업

# 파일시스템 백업 포함
velero backup create pvc-backup \
--default-volumes-to-fs-backup

# 특정 PVC만 백업
velero backup create postgres-backup \
--include-resources persistentvolumeclaims \
--selector app=postgresql

스케줄 백업

apiVersion: velero.io/v1
kind: Schedule
metadata:
name: daily-backup
namespace: velero
spec:
schedule: "0 2 * * *" # 매일 오전 2시
template:
includedNamespaces:
- lumie-dev
- lumie-prod
- lumie-cache
- lumie-db
defaultVolumesToFsBackup: true
ttl: 168h0m0s # 7일 보존

백업 상태 확인

# 백업 목록 조회
velero backup get

# 백업 상세 정보
velero backup describe <backup-name>

# 백업 로그 확인
velero backup logs <backup-name>

복원 작업

전체 복원

# 백업에서 전체 복원
velero restore create restore-$(date +%Y%m%d-%H%M%S) \
--from-backup <backup-name>

# 특정 네임스페이스만 복원
velero restore create lumie-restore \
--from-backup <backup-name> \
--include-namespaces lumie-dev

선택적 복원

# 특정 리소스만 복원
velero restore create config-restore \
--from-backup <backup-name> \
--include-resources configmaps,secrets \
--selector app=postgresql

# 라벨 셀렉터로 복원
velero restore create app-restore \
--from-backup <backup-name> \
--selector app=postgresql

네임스페이스 매핑

# 다른 네임스페이스로 복원
velero restore create test-restore \
--from-backup <backup-name> \
--namespace-mappings lumie-prod:lumie-test

복원 상태 확인

# 복원 목록 조회
velero restore get

# 복원 상세 정보
velero restore describe <restore-name>

# 복원 로그 확인
velero restore logs <restore-name>

모니터링

Prometheus 메트릭

metrics:
enabled: true
serviceMonitor:
enabled: true

주요 메트릭

메트릭설명
velero_backup_total총 백업 수
velero_backup_success_total성공한 백업 수
velero_backup_failure_total실패한 백업 수
velero_backup_duration_seconds백업 소요 시간
velero_restore_total총 복원 수
velero_volume_snapshot_success_total볼륨 스냅샷 성공 수

알림 규칙

groups:
- name: velero.rules
rules:
- alert: VeleroBackupFailure
expr: increase(velero_backup_failure_total[1h]) > 0
for: 0m
labels:
severity: critical
annotations:
summary: "Velero backup failed"
description: "Velero backup has failed in the last hour"

- alert: VeleroBackupPartialFailure
expr: increase(velero_backup_partial_failure_total[1h]) > 0
for: 0m
labels:
severity: warning
annotations:
summary: "Velero backup partially failed"

- alert: VeleroRestoreFailure
expr: increase(velero_restore_failed_total[1h]) > 0
for: 0m
labels:
severity: critical
annotations:
summary: "Velero restore failed"

운영 가이드

백업 검증

# 백업 무결성 확인
velero backup describe <backup-name> --details

# 백업 내용 확인
velero backup download <backup-name>
tar -tzf <backup-name>.tar.gz

백업 정리

# 만료된 백업 수동 삭제
velero backup delete <backup-name>

# TTL 기반 자동 정리 확인
velero backup get --show-labels

스토리지 사용량 확인

# MinIO에서 백업 크기 확인
mc du myminio/velero-backups

# 백업별 크기 확인
mc ls --recursive myminio/velero-backups

재해 복구 시나리오

시나리오 1: 네임스페이스 삭제

# 1. 삭제된 네임스페이스 확인
kubectl get ns

# 2. 최신 백업에서 복원
velero restore create ns-recovery \
--from-backup latest-backup \
--include-namespaces deleted-namespace

# 3. 복원 상태 확인
velero restore describe ns-recovery

시나리오 2: 전체 클러스터 장애

# 1. 새 클러스터에 Velero 설치
helm install velero vmware-tanzu/velero -f values.yaml

# 2. 백업 스토리지 연결 확인
velero backup-location get

# 3. 사용 가능한 백업 확인
velero backup get

# 4. 전체 복원 실행
velero restore create cluster-recovery \
--from-backup <latest-full-backup>

# 5. 복원 진행 상황 모니터링
watch velero restore get

시나리오 3: 특정 애플리케이션 복구

# 1. 애플리케이션 중지
kubectl scale deployment myapp --replicas=0

# 2. PVC 데이터 복원
velero restore create app-data-recovery \
--from-backup <backup-name> \
--include-resources persistentvolumeclaims \
--selector app=myapp

# 3. 설정 복원
velero restore create app-config-recovery \
--from-backup <backup-name> \
--include-resources configmaps,secrets \
--selector app=myapp

# 4. 애플리케이션 재시작
kubectl scale deployment myapp --replicas=1

성능 최적화

백업 성능

# Node Agent 리소스 증가
nodeAgent:
resources:
requests:
cpu: 100m
memory: 512Mi
limits:
memory: 1Gi

# 병렬 백업 설정
configuration:
defaultVolumesToFsBackup: true
uploaderType: kopia # 더 빠른 업로더

네트워크 최적화

# MinIO 연결 최적화
configuration:
backupStorageLocation:
- name: default
config:
s3Url: http://minio.minio.svc.cluster.local:9000
# 멀티파트 업로드 설정
multipartUploadThreshold: "64MB"
multipartChunkSize: "16MB"

보안

접근 제어

# RBAC 설정
serviceAccount:
server:
create: true
name: velero

rbac:
create: true
clusterAdministrator: true

암호화

# 백업 암호화 (향후 구성)
velero backup create encrypted-backup \
--encryption-key-file encryption.key

감사 로깅

# Velero 작업 로깅
configuration:
logLevel: info
logFormat: json

문제 해결

일반적인 문제

1. 백업 실패

# 백업 로그 확인
velero backup logs <backup-name>

# 백업 스토리지 연결 확인
velero backup-location get

# MinIO 연결 테스트
kubectl exec -it velero-xxx -n velero -- \
aws s3 ls s3://velero-backups --endpoint-url http://minio.minio.svc.cluster.local:9000

2. 복원 실패

# 복원 로그 확인
velero restore logs <restore-name>

# 리소스 충돌 확인
kubectl get events --sort-by=.metadata.creationTimestamp

# 네임스페이스 상태 확인
kubectl get ns <namespace> -o yaml

3. Node Agent 문제

# Node Agent 상태 확인
kubectl get pods -n velero -l name=node-agent

# Node Agent 로그 확인
kubectl logs -n velero -l name=node-agent

# 볼륨 마운트 확인
kubectl describe pod <node-agent-pod> -n velero

디버깅 도구

# Velero 디버그 정보 수집
velero debug --output-dir ./debug-info

# 백업 내용 다운로드 및 분석
velero backup download <backup-name>
tar -xzf <backup-name>.tar.gz

고급 기능

백업 훅

# Pre/Post 백업 훅 설정
apiVersion: v1
kind: Pod
metadata:
annotations:
pre.hook.backup.velero.io/command: '["/bin/bash", "-c", "pg_dump > /tmp/backup.sql"]'
post.hook.backup.velero.io/command: '["/bin/bash", "-c", "rm /tmp/backup.sql"]'

백업 필터링

# 라벨 기반 백업
velero backup create selective-backup \
--selector environment=production

# 리소스 제외
velero backup create filtered-backup \
--exclude-resources events,pods

크로스 클러스터 마이그레이션

# 소스 클러스터에서 백업
velero backup create migration-backup

# 대상 클러스터에서 복원
velero restore create migration-restore \
--from-backup migration-backup

이 문서는 Velero의 설치, 구성, 운영에 대한 포괄적인 가이드를 제공합니다. Kubernetes 클러스터의 백업 및 재해 복구 전략에 대한 추가 정보는 Velero 공식 문서를 참조하세요.