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 CREODIAS 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://tenant-manager.eo-lab.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:
/kubernetes/How-To-Access-Kubernetes-Cluster-Post-Deployment-Using-Kubectl-On-Creodias-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 CREODIAS 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
/s3/How-to-use-Object-Storage-on-Creodias.
- 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-EO-Lab-FRA1-1.
In unserem Beispiel muss ein Container namens „bucketnew“ existieren:

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:

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

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:

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:

Sie können auch das Velero CLI verwenden, um die vorhandenen Backups aufzulisten:
velero backup get
Das ist das Ergebnis im Terminalfenster:

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:

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.