Veröffentlicht am

Velero Backup mit MinIO: Kubernetes Cluster sichern

Teilen:
Authors

TL;DR

Velero sichert Kubernetes-Ressourcen und Persistent Volumes in S3-kompatiblen Storage. Mit MinIO als Self-Hosted-Backend hast du eine vollständige Backup-Lösung ohne Cloud-Abhängigkeit. Diese Anleitung führt dich von der MinIO-Installation über Velero-Setup bis zu automatischen Backup-Schedules.


Velero + MinIO: Backup-Lösung für Kubernetes

Kein Backup, kein Mitleid — das gilt auch für Kubernetes-Cluster. Velero (ehemals Heptio Ark) ist das Standard-Tool für Cluster-Backups und kann mit MinIO als S3-kompatiblem Backend komplett on-premises betrieben werden. In diesem Tutorial richten wir beides ein.

Voraussetzungen

  • Kubernetes-Cluster (ab v1.20)
  • kubectl konfiguriert
  • helm installiert (v3+)
  • Storage-Kapazität für MinIO (mindestens 50 GB empfohlen)

Prüfe zuerst deine Cluster-Verbindung:

kubectl cluster-info
kubectl get nodes

Teil 1: MinIO installieren

MinIO stellt eine S3-kompatible API bereit. Velero nutzt diese als Backup-Ziel — identisch zum AWS-S3-Plugin, nur eben lokal.

MinIO per Helm deployen

# Namespace erstellen
kubectl create namespace minio

# Helm-Repo hinzufügen
helm repo add minio https://charts.min.io/
helm repo update

# MinIO installieren
helm install minio minio/minio \
  --namespace minio \
  --set mode=standalone \
  --set replicas=1 \
  --set persistence.size=50Gi \
  --set rootUser=minioadmin \
  --set rootPassword=minio-secret-pw-2026 \
  --set resources.requests.memory=512Mi \
  --set consoleService.type=ClusterIP

Warte bis der Pod läuft:

kubectl wait --for=condition=Ready pod -l app=minio -n minio --timeout=120s

MinIO-Bucket erstellen

Für den Bucket-Zugriff nutzen wir Port-Forwarding und den MinIO-Client (mc):

# Port-Forward zur MinIO-API (Port 9000)
kubectl port-forward svc/minio -n minio 9000:9000 &

# MinIO Client installieren (falls nicht vorhanden)
# macOS:
brew install minio/stable/mc
# Linux:
curl -LO https://dl.min.io/client/mc/release/linux-amd64/mc && chmod +x mc && sudo mv mc /usr/local/bin/

# Alias konfigurieren
mc alias set k8s-minio http://localhost:9000 minioadmin minio-secret-pw-2026

# Backup-Bucket erstellen
mc mb k8s-minio/velero-backups

Ob der Bucket existiert, prüfst du mit:

mc ls k8s-minio/

Teil 2: Velero installieren

Credentials-Datei anlegen

Velero braucht Zugangsdaten im AWS-Credential-Format:

cat <<EOF > /tmp/velero-credentials
[default]
aws_access_key_id=minioadmin
aws_secret_access_key=minio-secret-pw-2026
EOF

Velero CLI installieren

# macOS
brew install velero

# Linux (aktuellste Version prüfen auf github.com/vmware-tanzu/velero)
VELERO_VERSION=v1.15.0
curl -LO https://github.com/vmware-tanzu/velero/releases/download/${VELERO_VERSION}/velero-${VELERO_VERSION}-linux-amd64.tar.gz
tar -xzf velero-${VELERO_VERSION}-linux-amd64.tar.gz
sudo mv velero-${VELERO_VERSION}-linux-amd64/velero /usr/local/bin/

Velero im Cluster installieren

Hier ist der zentrale Befehl — s3Url zeigt auf den MinIO-Service im Cluster:

velero install \
  --provider aws \
  --plugins velero/velero-plugin-for-aws:v1.11.0 \
  --bucket velero-backups \
  --secret-file /tmp/velero-credentials \
  --backup-storage-location-config \
    region=minio,s3ForcePathStyle=true,s3Url=http://minio.minio.svc:9000 \
  --use-volume-snapshots=false \
  --namespace velero
ParameterWertErklärung
--provider awsawsS3-kompatibler Provider
--pluginsvelero-plugin-for-awsAWS/S3-Plugin für MinIO
--s3Urlhttp://minio.minio.svc:9000Cluster-interner MinIO-Endpunkt
--s3ForcePathStyletrueNötig für MinIO (kein Virtual-Host-Style)

Prüfe, ob alles läuft:

kubectl get pods -n velero
velero version

Die Ausgabe sollte sowohl Client- als auch Server-Version zeigen.

Teil 3: Erstes Backup erstellen

Manuelles Backup

# Gesamtes Cluster sichern
velero backup create full-backup-$(date +%Y%m%d)

# Status prüfen
velero backup describe full-backup-$(date +%Y%m%d)

# Nur einen Namespace sichern
velero backup create app-backup \
  --include-namespaces production,staging

Backup-Status überwachen

# Alle Backups auflisten
velero backup get

# Details eines Backups anzeigen
velero backup describe full-backup-$(date +%Y%m%d) --details

# Logs bei Problemen
velero backup logs full-backup-$(date +%Y%m%d)

Automatische Schedules einrichten

Tägliche Backups mit 7 Tagen Aufbewahrung:

# Tägliches Backup um 02:00 UTC
velero schedule create daily-backup \
  --schedule="0 2 * * *" \
  --ttl 168h

# Wöchentliches Full-Backup (Sonntag 03:00 UTC), 30 Tage Aufbewahrung
velero schedule create weekly-full \
  --schedule="0 3 * * 0" \
  --ttl 720h

# Schedules prüfen
velero schedule get
ScheduleCronTTLZweck
daily-backup0 2 * * *168h (7 Tage)Tägliche Sicherung
weekly-full0 3 * * 0720h (30 Tage)Wöchentliches Full-Backup

Teil 4: Restore — Backup wiederherstellen

Ein Backup ist nur so gut wie der getestete Restore. Hier die wichtigsten Szenarien.

Komplettes Restore

# Aus einem bestimmten Backup wiederherstellen
velero restore create --from-backup full-backup-20260308

# Status prüfen
velero restore get
velero restore describe full-backup-20260308-restore --details

Einzelnen Namespace wiederherstellen

velero restore create --from-backup full-backup-20260308 \
  --include-namespaces production

Nur bestimmte Ressourcen wiederherstellen

# Nur Deployments und Services
velero restore create --from-backup full-backup-20260308 \
  --include-resources deployments,services

# In einen anderen Namespace wiederherstellen
velero restore create --from-backup full-backup-20260308 \
  --include-namespaces production \
  --namespace-mappings production:production-restored

Troubleshooting

Die häufigsten Probleme und ihre Lösungen:

Backup bleibt auf "InProgress" hängen:

# Controller-Logs prüfen
kubectl logs deployment/velero -n velero

# Häufigste Ursache: MinIO nicht erreichbar
kubectl exec -it deployment/velero -n velero -- \
  wget -qO- http://minio.minio.svc:9000/minio/health/live

"NoValidStorageLocation"-Fehler:

# BackupStorageLocation prüfen
kubectl get backupstoragelocation -n velero
velero backup-location get

# Status sollte "Available" sein
# Falls nicht: Credentials und s3Url prüfen

Backup enthält keine PV-Daten:

Ohne Volume-Snapshot-Provider sichert Velero nur Kubernetes-Ressourcen (YAML-Definitionen), nicht die tatsächlichen Daten in Persistent Volumes. Für PV-Backups brauchst du entweder:

  • CSI-Snapshot-Support (--use-volume-snapshots=true + CSI-Driver)
  • Velero Restic/Kopia-Integration für dateibasierte Backups:
# Velero mit Kopia (File-System-Backup) neu installieren
velero install \
  --provider aws \
  --plugins velero/velero-plugin-for-aws:v1.11.0 \
  --bucket velero-backups \
  --secret-file /tmp/velero-credentials \
  --backup-storage-location-config \
    region=minio,s3ForcePathStyle=true,s3Url=http://minio.minio.svc:9000 \
  --use-node-agent \
  --default-volumes-to-fs-backup \
  --namespace velero

FAQ

Kann ich Velero mit MinIO in Production einsetzen?

Ja, aber MinIO sollte dann im Distributed-Mode (mindestens 4 Nodes) laufen und eigenes Monitoring haben. Für kleine Cluster reicht Standalone, für kritische Workloads empfiehlt sich Erasure Coding.

Wie groß werden die Backups?

Velero speichert Kubernetes-Ressourcen als komprimierte tar-Archive. Ein Namespace mit 50 Ressourcen ist typischerweise nur wenige MB groß. PV-Daten (via Kopia/Restic) entsprechen der tatsächlichen Datenmenge.

Kann ich Backups in einen anderen Cluster wiederherstellen?

Ja, das ist ein Hauptanwendungsfall. Installiere Velero im Ziel-Cluster mit denselben MinIO-Credentials und Bucket. Die Backups erscheinen automatisch und können restored werden.

Wie teste ich Backups regelmäßig?

Richte einen CronJob ein, der wöchentlich ein Restore in einen Test-Namespace durchführt und das Ergebnis prüft. Alternativ: Velero-Backup in eine CI/CD-Pipeline integrieren.


Nächster Schritt: Richte ein Monitoring für deine Backups ein. Velero exportiert Prometheus-Metriken auf Port 8085 — kombiniere das mit dem kube-prometheus-stack, um bei fehlgeschlagenen Backups alarmiert zu werden.

Kubernetes-Beratung gesucht?

Wir helfen deutschen Unternehmen bei der Kubernetes-Implementierung, Migration und Optimierung. DSGVO-konform und praxiserprobt.

📖 Verwandte Artikel

Weitere interessante Beiträge zu ähnlichen Themen