How to: Velero und der Linode Object Storage

Es hat eine ganze Weile gedauert, bis ich das perfekte Setup für meinen Kubernetes-Cluster auf Linode gefunden habe – vor allem, was funktionierende Backups für Web-Instanzen mit Persistent Volume Claims (PVCs) betrifft. Mir war wichtig, im Fall der Fälle meine Daten unkompliziert wiederherstellen zu können.

Schaut es euch gerne an – vielleicht erspare ich damit jemandem da draußen ein paar Stunden „Kopfzerbrechen“…

Warum Velero?

Nach einiger Recherche habe ich Velero als die flexibelste und am besten unterstützte Kubernetes-Backup-Lösung gefunden. Die offizielle Dokumentation, die Helm-Chart-Guides und die Plugin-Anleitungen auf GitHub sind wirklich umfassend.

Die eigentliche Herausforderung war allerdings, Velero dazu zu bringen auch tatsächlich Backups zu machen 😀

Mein funktionierendes Setup

Unten findest du meine aktuelle Konfiguration – getestet und funktionsfähig mit der neuesten Version von Velero, dem AWS-Plugin und dem S3-kompatiblen Storage von Linode.

values.yaml (Schema, Default values)

				
					image:
  repository: velero/velero
  tag: v1.16.2

credentials:
  useSecret: true
  existingSecret: cloud-credentials

configuration:
  logLevel: warning
  backupStorageLocation:
    - name: default
      provider: velero.io/aws
      bucket: velero-backups
      checksumAlgorithm: "" # <- needed after velero-plugin-for-aws:v1.9.0
      default: true
      config:
        region: eu-central-1
        s3Url: https://eu-central-1.linodeobjects.com
  volumeSnapshotLocation:
    - name: default
      provider: linode.com/velero
      config:
        region: eu-central-1
        s3Url: https://eu-central-1.linodeobjects.com
  extraEnvVars:
    - name: LINODE_TOKEN
      valueFrom:
        secretKeyRef:
          key: linode_token
          name: cloud-credentials

deployNodeAgent: true
snapshotsEnabled: false
backupsEnabled: true

initContainers:
  - name: velero-plugin-for-aws
    image: velero/velero-plugin-for-aws:v1.12.1
    volumeMounts:
      - mountPath: /target
        name: plugins
  - name: velero-plugin-linode
    image: linode/velero-plugin:v0.0.1
    volumeMounts:
      - mountPath: /target
        name: plugins

nodeAgent:
  tolerations:
    - key: "wordpress"
      operator: "Equal"
      value: "only"
      effect: "NoSchedule"
				
			
WICHTIG

Wenn du Linode zusammen mit dem velero-plugin-for-aws verwendest, funktionieren Versionen bis einschließlich 1.9.0 auch ohne Angabe von

checksumAlgorithm: ""

Von Version 1.9.1 bis vor 1.10 ist diese Option erforderlich, aber nicht konfigurierbar. <- hier liegt der Grund des scheiterns mit Linode 

Du musst also entweder bei Version 1.9.0 bleiben oder auf 1.10 (oder neuer) upgraden, wo die Option unterstützt und konfigurierbar ist.
Ab Version 1.10 kannst du die Option einfach hinzufügen und einen leeren String setzen, um den Standardwert des Plugins zu überschreiben.

Das LINODE_TOKEN wird für Snapshots verwendet (über das Linode Velero Plugin), was nach meiner Erfahrung noch etwas experimentell ist.

Schritt für Schritt

1. Erstelle deine Secret(s)

Erstelle eine Datei mit dem Namen secret.yaml und trage dort deine Linode- und S3-Zugangsdaten ein (ersetze die Platzhalter durch deine tatsächlichen Schlüssel):

				
					apiVersion: v1
kind: Secret
stringData:
  linode_token: <linode-api-key>
  cloud: |
    [default]
    aws_access_key_id = <object-storage-access-key>
    aws_secret_access_key = <object-storage-secret-key>
type: Opaque
				
			

2. Erstelle einen Namespace und das Secret

				
					kubectl create ns velero
kubectl apply -f secret.yaml -n velero

				
			

3. Deploye Velero mit Helm

				
					helm upgrade --install velero vmware-tanzu/velero -n velero --create-namespace -f values.yaml
				
			

Fertig!

Test: Erstellen eines Backups

Um ein manuelles Backup zu erstellen, führe folgenden Befehl aus:

				
					velero create backup test --include-namespaces=<your-namespace>
				
			

Um wiederkehrende Backups einzustellen, füge einfach folgenden Snippte mit in die values.yaml:

				
					schedules:
  wordpress: # <- just a name
    disabled: false
    schedule: "0 0 * * *"
    useOwnerReferencesInBackup: false
    paused: false
    skipImmediately: false
    template:
      ttl: "240h"
      storageLocation: default
      includedNamespaces:
        - wordpress
				
			

Anschliessend einfach nochmal den helm upgrade Befehl ausführen um die Änderungen auf dein Deployment anzuwenden.

Fehlerbehebung & häufige Fehlerquellen

Fail 1

Entsprechend der GitHub-Plugin-Dokumentation habe ich anfangs erfolgreich Backups und Snapshots erstellen können. Beim zweiten Backup gab es jedoch einen Fehler – vermutlich, weil ich keine Restic- bzw. Node-Agent-Integration verwendet habe und die geklonten Volumes immer gleich benannt wurden.
Ich habe das an dieser Stelle aber nicht weiter untersucht…

Velero: message: /CloneVolume returned error: [400] [label] Label must be unique
name: /scaleit-wordpress-6cc695795b-pknch message: /Error backing up item error: /error taking snapshot of volume: rpc error: code = Aborted desc = plugin panicked: runtime error: invalid memory address or nil pointer dereference, stack trace: goroutine 66

Fail 2

Die meisten Blogartikel erwähnen die Anforderung an den Checksum-Algorithmus ab Plugin-Version 1.9.1 nicht.
Bei einer falschen Einstellung kann es passieren, dass zwar Kopia-Ordner für PVCs angelegt werden, das Hochladen der Metadaten jedoch fehlschlägt, weil standardmäßig der falsche Checksum-Algorithmus verwendet wird.

time="2025-07-30T15:13:34Z" level=error msg="Error uploading log file" backup=wp-test-backup4 bucket=velero-backups error="rpc error: code = Unknown desc = error putting object backups/wp-test-backup4/wp-test-backup4-logs.gz: operation error S3: PutObject, https response error StatusCode: 400, ..

Zum Abschluss

Ich hoffe, dieser Artikel hilft allen, die mit Velero und Linode S3 Backups auf Kubernetes zu kämpfen haben!

Wenn ihr Tipps zur Verbesserung oder Korrekturen habt, schreibt sie gerne in die Kommentare – ich freue mich auch über eure Erfahrungen und lerne gerne dazu.

Für Suchmaschinen / andere Troubleshooter:

  • Die Verwendung des Velero-Plugins gemäß der GitHub-Dokumentation speicherte zwar die Metadaten, aber nachfolgende Backups schlugen fehl.
  • Die offizielle Dokumentation lässt manchmal bestimmte Details aus (wie die Anforderung checksumAlgorithm für S3-kompatiblen Storage).
  • Prüft immer die Versionen von Plugin und Velero auf subtile, eventuell inkompatible Änderungen.

Ressourcen

Docker Images:
Velero: https://hub.docker.com/u/velero
Linode Plugin for Velero: https://hub.docker.com/r/linode/velero-plugin

Github:
Linode Plugin for Velero (Snapshots): https://github.com/linode/velero-plugin
Velero AWS Plugin: https://github.com/vmware-tanzu/velero-plugin-for-aws
The main application: https://github.com/vmware-tanzu/velero

Documentation:
Velero: https://velero.io/docs/v1.7/

Share the Post:

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert