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.

Velero Backup-Prozess

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:

  1. Einen eigenen Kubernetes-Cluster – für Testzwecke eignet sich Kind.
  2. Einen S3-Bucket zur Speicherung der Backups. Hier verwenden wir MinIO.
  3. 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 accessKey und secretKey mit 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.