Backups mit Velero erstellen

Einführung
Velero ist ein Open-Source-Tool zur Erstellung von Backups Ihrer Kubernetes-Cluster – einschließlich Ihrer Kubernetes-Volumes! Velero funktioniert, indem es die Kubernetes API nach den gewünschten Manifests fragt, ohne direkten Zugriff auf die etcd-Datenbank zu benötigen. Das ist besonders nützlich bei verwalteten Kubernetes-Clustern wie AWS, GCP oder Digital Ocean, bei denen kein direkter Zugang zu den Master-Nodes besteht.

Wie im Diagramm dargestellt, erstellt der Benutzer eine Velero-Backup-Ressource. Der auf dem Cluster installierte Velero-Controller fragt daraufhin die Kubernetes API ab und führt das Backup der gewünschten Ressourcen durch. Die Backup-Daten können dann in einen S3-Bucket oder einen anderen Backup-Speicherort hochgeladen werden.
Das Wiederherstellen aus einem Backup funktioniert ähnlich. Wenn der Benutzer eine Restore-Ressource erstellt, lädt der Velero-Controller die Backup-Daten herunter und stellt sie im Cluster wieder her. Velero führt eine nicht-destruktive Wiederherstellung durch – bestehende Ressourcen im Cluster werden nicht gelöscht, sondern übersprungen.
Mehr Informationen zur Funktionsweise von Velero finden Sie hier.
Voraussetzungen
Vor der Nutzung von Velero benötigen wir:
- Einen eigenen Kubernetes-Cluster – für Testzwecke eignet sich Kind.
- Einen S3-Bucket zur Speicherung der Backups. Hier verwenden wir MinIO.
- Den Velero-Client. Dies ist meiner Meinung nach der einfachste Weg, Backups mit Velero zu installieren, zu erstellen und wiederherzustellen.
MinIO
Dieses einfache docker-compose-Setup startet MinIO. Kopieren Sie die Datei und führen Sie docker-compose up aus:
# docker-compose.yaml
version: '3'
services:
minio:
image: quay.io/minio/minio:latest
command: server /data --console-address ":9001"
environment:
- MINIO_ROOT_USER=admin
- MINIO_ROOT_PASSWORD=password
ports:
- "9001:9001"
- "9000:9000"
volumes:
- /data
Öffnen Sie http://localhost:9001, melden Sie sich mit admin/password an und erstellen Sie einen Bucket namens velero-backups.
Velero-Client
Laden Sie die neueste Version herunter und entpacken Sie sie:
tar -xvf <RELEASE-TARBALL-NAME>.tar.gz
Verschieben Sie das velero-Binary in Ihren bin-Ordner (/usr/local/bin) oder fügen Sie es Ihrem $PATH hinzu.
Velero im Cluster installieren
Die Standardinstallation von Velero erfordert einen Speicherort. Da wir MinIO verwenden, erstellen Sie zunächst eine Datei namens credentials-velero mit den MinIO-Zugangsdaten:
# credentials-velero
[default]
aws_access_key_id = admin
aws_secret_access_key = password
HINWEIS: In der Cloud müssen Sie einen echten
accessKeyundsecretKeymit den richtigen Berechtigungen verwenden. Je nach Cloud-Anbieter gibt es eine Liste unterstützter Provider hier. Da MinIO mit AWS S3 kompatibel ist, verwenden wir das Velero-Plugin für AWS.
Installieren Sie Velero mit Provider, Plugin, Secret-Datei und Backup-Speicherkonfiguration:
velero install --provider aws --bucket velero-backups --plugins velero/velero-plugin-for-aws:v1.4.1 --secret-file ./credentials-velero --use-volume-snapshots=false --backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://localhost:9000 --use-restic
Dadurch wird der Velero-Controller im Namespace velero installiert. In diesem Beispiel verwenden wir auch die restic-Integration, die Backups von Volumes ermöglicht.
TIPP: Velero kann auch Snapshots von Volumes erstellen, wenn ein unterstützter Cloud-Anbieter verwendet wird – in diesem Fall ist die restic-Integration nicht erforderlich.
Ein Backup erstellen
Mit dem Velero-Client können verschiedene Arten von Backups erstellt werden. Am schnellsten geht es mit Namespace-basierten Backups:
velero backup create <Backup-Name> --include-namespaces <namespace1,namespace2,...,namespaceN>
Standardmäßig werden Volumes nicht gesichert. Dazu muss die Annotation backup.velero.io/backup-volumes=<volume-name> an den Pods hinzugefügt werden, an denen ein Volume eingehängt ist.
Beispiel: Ein RabbitMQ-Pod mit einem Volume:
apiVersion: v1
kind: Pod
metadata:
annotations:
backup.velero.io/backup-volumes: persistence
labels:
app.kubernetes.io/component: rabbitmq
name: rabbitmq-server-0
****
volumes:
- name: persistence
persistentVolumeClaim:
claimName: persistence-rabbitmq-server-0
In diesem Fall müsste die Annotation wie folgt gesetzt werden: kubectl annotate pod rabbitmq-server-0 backup.velero.io/backup-volumes=persistence.
Backup-Zeitpläne
Es ist auch möglich, wiederkehrende Backups über Zeitpläne einzurichten. Im folgenden Beispiel wird jeden Samstag um 23:00 Uhr ein Backup für bestimmte Namespaces erstellt, mit einer Aufbewahrungszeit von 21 Tagen. Backups, die älter als 21 Tage sind, werden automatisch aus dem Speicherort und der Backup-Liste im Cluster entfernt.
velero schedule create sat-23uhr --schedule="0 23 * * 6" --ttl "504h" --include-namespaces namespace1,namespace2,namespace3
Nach dem Einrichten des Zeitplans können Sie die erstellten Backups anzeigen:
velero backup get
Um Informationen zum erstellten Zeitplan abzurufen:
velero schedule get
Ein Backup wiederherstellen
So stellen Sie ein Backup wieder her:
velero restore create --from-backup <backup-name>
Um vorhandene Backups aufzulisten:
velero backups get
Wenn Sie mich unterstützen möchten, kaufen Sie mir einen Kaffee.