Sicherung eines Kubernetes-Clusters mit Velero

Was ist Velero

Velero ist ein offizielles Open-Source-Projekt von VMware. Es kann alle Kubernetes-API-Objekte und persistenten Volumes des Clusters, auf dem es installiert ist, sichern. Die gesicherten Objekte können auf demselben Cluster oder auf einem neuen wiederhergestellt werden. Die Verwendung eines Pakets wie Velero ist für eine nachhaltige Entwicklung in einem Kubernetes-Cluster unerlässlich. Im Wesentlichen erstellen Sie einen Objektspeicher unter OpenStack, entweder mit Horizon oder dem Swift-Modul des Befehls openstack, und speichern dann den Cluster-Status in diesem. Die Wiederherstellung erfolgt in umgekehrter Weise - man liest aus diesem Objektspeicher und speichert ihn in einem Kubernetes-Cluster. Velero verfügt über ein eigenes CLI-Befehlssystem, sodass es möglich ist, die Erstellung von Backups mithilfe von Cron-Jobs zu automatisieren.

Was wir behandeln werden

  • EC2-Client-Anmeldeinformationen abrufen

  • Anpassen der Konfigurationsdatei „values.yaml“.

  • Erstellen eines Namespaces namens velero für den Zugriff auf den Kubernetes-Cluster

  • Installation von Velero mit einem Helm-Diagramm

  • Installieren und Löschen von Backups mit Velero

  • Beispiel 1: Grundlagen der Wiederherstellung einer Anwendung

  • Beispiel 2 Schnappschuss der Wiederherstellung einer Anwendung

Voraussetzungen

Nr. 1 Konto

Sie benötigen ein CODE-DE Konto mit Zugriff auf die Horizon-Schnittstelle https://cloud.fra1-1.cloudferro.com/auth/login/?next=/.

Die von Ihnen benötigten Ressourcen müssen in Ihrem Konto abgebildet sein. Überprüfen Sie Ihre Kontodaten unter https://administration.code-de.org/login.

Nr. 2 Zugriff auf Kubernetes-Cluster nach dessen Bereitstellung

Wir gehen außerdem davon aus, dass Sie über einen oder mehrere Kubernetes-Cluster verfügen, die über den Befehl kubectl zugänglich sind:

Zugriff auf Kubernetes-Cluster nach der Bereitstellung mit Kubectl auf CODE-DE OpenStack Magnum

Dieser Artikels zeigt die Einrichtung der Systemvariablen KUBECONFIG, die auf die Konfigurationsdatei für den Zugriff auf die Kubernetes-Cloud verweist. Ein typischer Befehl wäre:

export KUBECONFIG=/home/username/Desktop/kubernetes/k8sdir/config

Falls Sie diese Konfigurationsdatei zum ersten Mal verwenden, sollten Sie die Verwendung sicherer machen, indem Sie den folgenden Befehl ausführen:

chmod 600 /home/username/Desktop/kubernetes/k8sdir/config

Nr. 3 Handhabung von Helm

Zur Installation von Velero werden wir Helm verwenden:

Einsatz von Helm Charts auf Magnum Kubernetes-Clustern auf der CODE-DE FRA1-1 Cloud.

Nr. 4 Einen verfügbaren Objektspeicher (S3 Bucket)

Um ein S3-Bucket zu erstellen oder auf den Objektspeicher zuzugreifen, können Sie die Horizon-Schnittstelle oder das OpenStack-CLI verwenden.

Horizon commands

Wie verwendet man den Objektspeicher?.

OpenStack-CLI

Sie können auch einen Befehl wie

openstack container

verwenden, um mit Objektspeicher zu arbeiten. Für weitere Informationen siehe /openstackcli/How-to-access-object-storage-using-OpenStack-CLI-on-CODE-DE-FRA1-1.

In unserem Beispiel muss ein Container namens „bucketnew“ existieren:

../_images/bucketnew_created.png

Sie können auch einen anderen Namen für das Bucket verwenden, während Sie diesen Artikel durcharbeiten.

Vor der Installation von Velero

Wir werden Velero auf Ubuntu 22.04 installieren; die Installation auf anderen Linux-Distributionen sollte ähnlich funktionieren.

Aktualisieren Sie Ihre Ubuntu-Umgebung:

sudo apt update && sudo apt upgrade

Sie benötigen Zugang zu einem Kubernetes-Cluster, v1.16 oder höher, mit aktiviertem DNS und Container-Netzwerk. Weitere Informationen zu unterstützten Kubernetes-Versionen finden Sie unter Velero compatibility matrix.

Installation von Velero

Schritt 1: Abrufen der EC2-Anmeldedaten

Holen Sie sich zunächst die EC2-Anmeldeinformationen von OpenStack. Sie sind für den Zugriff auf den privaten Bucket (Container) erforderlich. Erzeugen Sie sie selbst, indem Sie die folgenden Befehle ausführen:

openstack ec2 credentials create
openstack ec2 credentials list

Speichern Sie Access Key und den Secret Key. Sie werden im nächsten Schritt benötigt, in dem Sie eine Velero-Konfigurationsdatei einrichten.

Schritt 2: Anpassen der Konfigurationsdatei - „values.yaml“.

Erstellen oder ändern Sie nun eine Konfigurationsdatei für Velero. Verwenden Sie einen Texteditor Ihrer Wahl, um diese Datei zu erstellen. Unter MacOS oder Linux können Sie z. B. nano verwenden:

sudo nano values.yaml

Füllen Sie die erforderlichen Felder aus, die in der Datei values.yaml mit ## gekennzeichnet sind:

initContainers:
- name: velero-plugin-for-aws
  image: velero/velero-plugin-for-aws:v1.4.0
  imagePullPolicy: IfNotPresent
  volumeMounts:
    - mountPath: /target
      name: plugins

configuration:
  provider: aws
  backupStorageLocation:
    provider: aws
    name: ## enter name of backup storage location (could be anything)
    bucket: ## enter name of bucket created in openstack
    default: true
    config:
      region: default
      s3ForcePathStyle: true
      s3Url: ## enter URL of object storage (for example "https://s3.fra1-1.cloudferro.com")
credentials:
  secretContents: ## enter access and secret key to ec2 bucket. This configuration will create kubernetes secret.
    cloud: |
      [default]
      aws_access_key_id=
      aws_secret_access_key=
  ##existingSecret: ## If you want to use existing secret, created from sealed secret, then use this variable and omit credentials.secretContents.
snapshotsEnabled: false
deployRestic: true
restic:
  podVolumePath: /var/lib/kubelet/pods
  privileged: true
schedules:
  mybackup:
    disabled: false
    schedule: "0 6,18 * * *" ## choose time, when scheduled backups will be make.
    template:
      ttl: "240h" ## choose ttl, after which the backups will be removed.
      snapshotVolumes: false

Speichern Sie die geänderte Konfigurationsdatei values.yaml.

Beispiel für eine bereits konfigurierte Datei:

initContainers:
- name: velero-plugin-for-aws
  image: velero/velero-plugin-for-aws:v1.4.0
  imagePullPolicy: IfNotPresent
  volumeMounts:
    - mountPath: /target
      name: plugins

configuration:
  provider: aws
  backupStorageLocation:
    provider: aws
    name: velerobackuptesting
    bucket: bucketnew
    default: true
    config:
      region: default
      s3ForcePathStyle: true
      s3Url: https://s3.fra1-1.cloudferro.com
credentials:
  secretContents: ## enter access and secret key to ec2 bucket. This configuration will create kubernetes secret.
    cloud: |
      [default]
      aws_access_key_id= c4b4ee62a18f4e0ba23f71629d2038e1x
      aws_secret_access_key= dee1581dac214d3dsa34037e826f9148
  ##existingSecret: ## If you want to use existing secret, created from sealed secret, then use this variable and omit credentials.secretContents.
snapshotsEnabled: false
deployRestic: true
restic:
  podVolumePath: /var/lib/kubelet/pods
  privileged: true
schedules:
  mybackup:
    disabled: false
    schedule: "0 * * *"
    template:
      ttl: "168h"
      snapshotVolumes: false

Schritt 3: Namespace erstellen

Velero muss in einem gleichnamigen Namespace installiert werden, velero. Dies ist der Befehl, um ihn zu erstellen:

kubectl create namespace velero
namespace/velero created

Schritt 4: Installation von Velero mit einer Helm-Chart

Hier die einzelnen Schritte zur Installation von Velero mit Hilfe eines Helm- Charts:

helm repo add vmware-tanzu https://vmware-tanzu.github.io/helm-charts

Die Ausgabe lautet:

"vmware-tanzu" has been added to your repositories

Mit dem folgenden Befehl wird Velero auf dem Cluster installiert:

helm install vmware-tanzu/velero --namespace velero --version 2.28 -f values.yaml --generate-name

Die Ausgabe sieht wie folgt aus:

../_images/installation_of_velero.png

Um zu sehen, welche Version von Velero tatsächlich installiert ist, verwenden Sie:

helm list --namespace velero

Merken Sie sich den verwendeten Namen velero-1721031498, den wir im weiteren Verlauf des Artikels verwenden werden. In Ihrem Fall notieren Sie sich den korrekten Velero-Namen und tauschen Sie den Zahlen-Wert entsprechend aus.

So können Sie überprüfen, ob Velero aktiv ist:

kubectl get deployment/velero-1721031498 -n velero

Die Ausgabe sieht dann etwa so aus:

NAME                READY   UP-TO-DATE   AVAILABLE   AGE
velero-1721031498   1/1     1            1           5m30s

Prüfen Sie, ob das Geheimzeichen erstellt worden ist:

kubectl get secret/velero-1721031498 -n velero

Das Ergebnis ist:

NAME                TYPE     DATA   AGE
velero-1721031498   Opaque   1      3d1h

Schritt 5: Installieren von Velero CLI

Der letzte Schritt ist die Installation des Velero CLI - Command Line Interface (Befehlszeilenschnittstelle), das für die Arbeit im Terminalfenster Ihres Betriebssystems geeignet ist.

Laden Sie von: https://github.com/vmware-tanzu/velero/releases unter Verwendung von wget den für Ihr Betriebssystem spezifizierten Client herunter. Hier laden wir die Version

velero-v1.9.1-linux-amd64.tar.gz

Es empfiehlt sich, die jeweils neueste Version herunterzuladen. Ändern Sie den Namen der Datei tar.gz entsprechend.

wget https://github.com/vmware-tanzu/velero/releases/download/v1.9.1/velero-v1.9.1-linux-amd64.tar.gz

Entpacken Sie die tar-Datei:

tar -xvf velero-v1.9.1-linux-amd64.tar.gz

Dies ist das erwartete Ergebnis:

velero-v1.9.1-linux-amd64/LICENSE
velero-v1.9.1-linux-amd64/examples/README.md
velero-v1.9.1-linux-amd64/examples/minio
velero-v1.9.1-linux-amd64/examples/minio/00-minio-deployment.yaml
velero-v1.9.1-linux-amd64/examples/nginx-app
velero-v1.9.1-linux-amd64/examples/nginx-app/README.md
velero-v1.9.1-linux-amd64/examples/nginx-app/base.yaml
velero-v1.9.1-linux-amd64/examples/nginx-app/with-pv.yaml
velero-v1.9.1-linux-amd64/velero

Verschieben Sie die extrahierte velero-Binärdatei an einen Ort in Ihrem $PATH (/usr/local/bin für die meisten Benutzer):

cd velero-v1.9.1-linux-amd64
# System might force using sudo
sudo mv velero /usr/local/bin
# check if velero is working
velero version
../_images/velero_version_working.png

Nach diesen Operationen sollten Sie velero-Befehle verwenden können. Um zu erfahren, wie Sie Velero verwenden können, rufen Sie die Velero Hilfe auf:

velero help

Arbeiten mit Velero

In Vorausetzung Nr. 4 und Schritt 2 der Installation haben wir

  • einen Objektspeicher namens „bucketnew“ erstellt und

  • Velero über den Parameter bucket: in der Datei values.yaml angewiesen, diesen zu verwenden.

Velero erstellt einen weiteren Objektspeicher mit dem Namen backups unter „bucketnew“ und erstellt dann weitere Objektspeicher für bestimmte Backups. Der folgende Befehl fügt zum Beispiel einen Objektspeicher namens mybackup2 hinzu:

velero backup create mybackup2
Backup request "mybackup2" submitted successfully.

So wird es in Horizon aussehen:

../_images/installed_mybackup2.png

Lassen Sie uns zwei weitere Backups hinzufügen. Das erste sollte alle Api-Objekte im Namespace velero sichern:

velero backup create mybackup3 --include-namespaces velero

Das zweite sichert alle Api-Objekte im Standard Namespace

velero backup create mybackup5 --include-namespaces default
Backup request "mybackup4" submitted successfully.

Dies ist die Struktur des Objektspeichers nach diesen drei Backups:

../_images/three_backups_mybackup.png

Sie können auch das Velero CLI verwenden, um die vorhandenen Backups aufzulisten:

velero backup get

Das ist das Ergebnis im Terminalfenster:

../_images/three_backups_mybackup.png

Beispiel 1 Wiederherstellung einer Anwendung

Lassen Sie uns nun zeigen, wie man eine Kubernetes-Anwendung wiederherstellt. Klonen wir zunächst eine Beispielanwendung von GitHub. Führen Sie dies aus:

git clone https://github.com/vmware-tanzu/velero.git
Cloning into 'velero'...
Resolving deltas: 100% (27049/27049), done.
cd velero

Starten Sie die nginx-Beispielanwendung:

kubectl apply -f examples/nginx-app/base.yaml
kubectl apply -f base.yaml
namespace/nginx-example unchanged
deployment.apps/nginx-deployment unchanged
service/my-nginx unchanged

Erstellen Sie ein Backup:

velero backup create nginx-backup --include-namespaces nginx-example
Backup request "nginx-backup" submitted successfully.

So sieht die Sicherung von nginx-backup in Horizon aus:

../_images/nginx-backup.png

Simulieren Sie eine Fehlfunktion:

kubectl delete namespaces nginx-example
# Wait for the namespace to be deleted
namespace "nginx-example" deleted

Wiederherstellung der verlorenen Anwendung:

velero restore create --from-backup nginx-backup
Restore request "nginx-backup-20220728013338" submitted successfully.
Run `velero restore describe nginx-backup-20220728013338` or `velero restore logs nginx-backup-20220728013338` for more details.

velero backup get
NAME         STATUS ERRORS WARNINGS CREATED EXPIRES STORAGE LOCATION SELECTOR
backup     New     0       0     <nil>   n/a                      <none>
nginx-backup   New     0       0     <nil>   n/a                      <none>

Beispiel 2 Snapshot Wiederherstellung einer Anwendung

Start the sample nginx app:

kubectl apply -f examples/nginx-app/with-pv.yaml
namespace/nginx-example created
persistentvolumeclaim/nginx-logs created
deployment.apps/nginx-deployment created
service/my-nginx created

Erstellen Sie ein Backup mit PV snapshotting:

velero backup create nginx-backup-vp --include-namespaces nginx-example
Backup request "nginx-backup" submitted successfully.
Run `velero backup describe nginx-backup` or `velero backup logs nginx-backup` for more details.

Simulieren Sie eine Fehlfunktion:

kubectl delete namespaces nginx-example
namespace "nginx-example" deleted

Wichtig

Da die Standard reclaim policy für dynamisch bereitgestellte PVs „Löschen“ ist, sollten diese Befehle Ihren Cloud-Anbieter veranlassen, den Datenträger zu löschen, auf dem das PV gesichert ist. Die Löschung erfolgt asynchron, so dass dies einige Zeit dauern kann.

Stellen Sie Ihre verlorenen Ressourcen wieder her:

velero restore create --from-backup nginx-backup-vp
Restore request "nginx-backup-20220728015234" submitted successfully.
Run `velero restore describe nginx-backup-20220728015234` or `velero restore logs nginx-backup-20220728015234` for more details.

Löschen einer Velero-Sicherung

Es gibt zwei Möglichkeiten, ein von Velero erstelltes Backup zu löschen.

Nur die benutzerdefinierte Backup-Ressource löschen.

Der Befehl

kubectl delete backup <backupName> -n <veleroNamespace>

löscht nur die benutzerdefinierte Backup-Ressource und nicht die zugehörigen Daten aus dem Objekt-/Blockspeicher

Alle Daten im Objekt-/Blockspeicher löschen.

Der Befehl

velero backup delete <backupName>

löscht die Sicherungsressource einschließlich aller Daten im Objekt- oder Blockspeicher.

Entfernen von Velero aus dem Cluster

Velero deinstallieren

So deinstallieren Sie die Velero-Version:

helm uninstall velero-1721031498 --namespace velero

So löschen Sie den Velero Namespace

kubectl delete namespace velero

Was als nächstes zu tun ist

Jetzt, wo Velero einsatzbereit ist, können Sie es in Ihre Arbeit integrieren. Es wird in allen klassischen Backup-Szenarien nützlich sein - für Disaster Recovery, Cluster- und Namespace-Migration, Tests und Entwicklung, Anwendungs-Rollbacks, Compliance und Auditing und so weiter. Abgesehen von diesen allgemeinen Anwendungsfällen hilft Velero bei spezifischen Kubernetes-Cluster-Aufgaben zur Sicherung, wie z. B.:

  • Sicherung und Wiederherstellung von Bereitstellungen, Diensten, Konfigurationskarten und Secrets,

  • Selektive Backups, z. B. nur für bestimmte Namespaces oder Label-Selektoren,

  • Volume-Snapshots über APIs von Cloud-Anbietern (AWS, Azure, GCP usw.)

  • Snapshots von persistenten Volumes für Point-in-Time-Wiederherstellung

  • Speichern von Sicherungsdaten in AWS S3, Google Cloud Storage, Azure Blob Storage usw.

  • Integration mit dem Befehl kubectl, so dass benutzerdefinierte Ressourcendefinitionen (Custom Resource Definitions, CRDs) zur Definition der Sicherungs- und Wiederherstellungskonfiguration verwendet werden können.