Skip to main content
  • »
  • KUBERNETES »
  • Kopia zapasowa klastra Kubernetes przy użyciu Velero

Kopia zapasowa klastra Kubernetes przy użyciu Velero

Czym jest Velero

Velero to oficjalny projekt open source firmy VMware. Może tworzyć kopie zapasowe wszystkich obiektów Kubernetes API i trwałych woluminów z klastra, na którym jest zainstalowany. Zarchiwizowane obiekty można przywrócić na tym samym klastrze lub na nowym. Korzystanie z pakietu takiego jak Velero jest niezbędne dla każdego poważnego rozwoju w klastrze Kubernetes.

Zasadniczo tworzysz magazyn obiektów pod OpenStack, używając Horizon lub modułu Swift polecenia openstack, a następnie zapisujesz w nim stan klastra. Przywracanie jest takie samo w odwrotnej kolejności - odczyt z tego magazynu obiektów i zapisanie go w klastrze Kubernetes.

Velero posiada własny system poleceń CLI, dzięki czemu możliwe jest zautomatyzowanie tworzenia kopii zapasowych za pomocą zadań cron.

Co będziemy omawiać

  • Pobieranie poświadczeń klienta EC2

  • Dostosowanie „values.yaml”, pliku konfiguracyjnego

  • Utworzenie przestrzeni nazw o nazwie velero w celu uzyskania precyzyjnego dostępu do klastra Kubernetes

  • Instalacja Velero za pomocą wykresu Helm

  • Instalowanie i usuwanie kopii zapasowych przy użyciu Velero

  • Przykład 1 Podstawy przywracania aplikacji

  • Przykład 2 Migawka przywracania aplikacji

Wymagania wstępne

Nr 1 Hosting

Potrzebne jest konto hostingowe NSIS z interfejsem Horizon https://horizon.cloudferro.com.

Zasoby, których potrzebujesz i używasz, będą odzwierciedlały stan Twojego portfela konta. Sprawdź statystyki swojego konta na stronie https://nsis-cloud-innovation.cloudferro.com/login.

Nr 2 Jak uzyskać dostęp do klastra Kubernetes po wdrożeniu

Zakładamy również, że masz jeden lub więcej klastrów Kubernetes gotowych i dostępnych za pośrednictwem polecenia kubectl:

Jak uzyskać dostęp do klastra Kubernetes po wdrożeniu przy użyciu Kubectl na NSIS OpenStack Magnum?

Wynikiem tego artykułu będzie ustawienie zmiennej systemowej KUBECONFIG, która wskazuje na plik konfiguracyjny dostępu do chmury Kubernetes. Typowym poleceniem będzie:

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

W przypadku, gdy po raz pierwszy korzystasz z tego konkretnego pliku konfiguracyjnego, zwiększ jego bezpieczeństwo, wykonując również następujące polecenie:

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

Nr 3 Handling Helmet

Aby zainstalować Velero, użyjemy Helm:

doc:/kubernetes/Deploying-Helm-Charts-on-Magnum-Kubernetes-Clusters-on-NSIS-Cloud.

Nr 4 Dostępny obiektowy magazyn danych S3

Aby go utworzyć, można uzyskać dostęp do obiektowej pamięci masowej za pomocą interfejsu Horizon lub CLI.

Polecenia Horizon

CLI

Można również użyć polecenia takiego jak

openstack container

do pracy z obiektową pamięcią masową. Więcej informacji można znaleźć w Jak uzyskać dostęp do object storage za pomocą OpenStack CLI na NSIS.

Tak czy inaczej, zakładamy, że istnieje kontener o nazwie „bucketnew”:

../_images/bucketnew_created.png

Podaj własną unikalną nazwę podczas pracy z tym artykułem.

Przed instalacją Velero

Zainstalujemy Velero na Ubuntu 22.04; korzystanie z innych dystrybucji Linuksa byłoby podobne.

Zaktualizuj i uaktualnij swoje środowisko Ubuntu:

sudo apt update && sudo apt upgrade

Konieczny będzie dostęp do klastra Kubernetes w wersji 1.16 lub nowszej, z włączoną obsługą DNS i sieci kontenerów. Aby uzyskać więcej informacji na temat obsługiwanych wersji Kubernetes, zobacz Velero compatibility matrix.

Krok 1 instalacji Uzyskanie poświadczeń klienta EC2

Najpierw pobierz poświadczenia EC2 z OpenStack. Są one niezbędne do uzyskania dostępu do prywatnego bucketu (kontenera). Wygeneruj je samodzielnie, wykonując następujące polecenia:

openstack ec2 credentials create
openstack ec2 credentials list

Zapisz gdzieś Klucz dostępu i Klucz tajny. Będą one potrzebne w następnym kroku, w którym należy skonfigurować plik konfiguracyjny Velero.

Krok instalacji 2 Dostosowanie pliku konfiguracyjnego - „values.yaml”

Teraz utwórz lub dostosuj plik konfiguracyjny dla Velero. Użyj wybranego edytora tekstu, aby utworzyć ten plik. Na przykład w systemie MacOS lub Linux można użyć nano, jak poniżej:

sudo nano values.yaml

Użyj pliku konfiguracyjnego dostarczonego poniżej. Wypełnij wymagane pola, które są oznaczone ##:

values.yaml

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.waw4-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

Wklej zawartość do pliku konfiguracyjnego values.yaml i zapisz.

Przykład już skonfigurowanego pliku:

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: bucket
    default: true
    config:
      region: default
      s3ForcePathStyle: true
      s3Url: s3.waw4-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

Krok instalacji 3 Tworzenie przestrzeni nazw

Velero musi być zainstalowane w przestrzeni nazw o nazwie velero. Oto polecenie do jej utworzenia:

kubectl create namespace velero
namespace/velero created

Krok instalacji 4 Instalacja Velero z wykresem Helm

Poniżej znajdują się polecenia instalacji Velero za pomocą wykresu Helm:

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

Wynik to:

"vmware-tanzu" has been added to your repositories

Poniższe polecenie zainstaluje velero w klastrze:

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

Wynik będzie wyglądał następująco:

../_images/installation_of_velero.png

Aby zobaczyć wersję Velero, która jest faktycznie zainstalowana, użyj:

helm list --namespace velero

Zwróć uwagę na użytą nazwę, velero-1721031498, której będziemy używać w dalszej części artykułu. W twoim przypadku zanotuj poprawną nazwę velero i zamień z nią wartość 1721031498.

Oto jak sprawdzić, czy Velero działa:

kubectl get deployment/velero-1721031498 -n velero

Wynik będzie podobny do tego:

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

Sprawdź, czy sekret został utworzony:

kubectl get secret/velero-1721031498 -n velero

Rezultat jest następujący:

NAME                TYPE     DATA   AGE
velero-1721031498   Opaque   1      3d1h

Krok instalacji 5 Instalacja Velero CLI

Ostatnim krokiem jest zainstalowanie Velero CLI - interfejsu wiersza poleceń odpowiedniego do pracy z okna terminala w systemie operacyjnym.

Pobierz klienta określonego dla twojego systemu operacyjnego ze strony: https://github.com/vmware-tanzu/velero/releases, używając wget. Tutaj pobieramy wersję

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

ale zaleca się pobranie najnowszej wersji. W takim przypadku należy odpowiednio zmienić nazwę pliku tar.gz.

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

Wyodrębnij plik tarball:

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

Jest to oczekiwany rezultat:

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

Przenieś wyodrębniony plik binarny velero do miejsca w $PATH (/usr/local/bin dla większości użytkowników):

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

Po tych operacjach powinieneś mieć możliwość korzystania z poleceń velero. Aby uzyskać pomoc, jak z nich korzystać, wykonaj:

velero help

Praca z Velero

Do tej pory mamy

  • utworzyła magazyn obiektów o nazwie „bucketnew” i

  • powiedział velero, aby używał go poprzez parametr bucket: w pliku values.yaml.

Velero utworzy kolejny magazyn obiektów o nazwie backups pod „bucketnew”, a następnie będzie kontynuować tworzenie magazynów obiektów dla poszczególnych kopii zapasowych. Na przykład poniższe polecenie doda magazyn obiektów o nazwie mybackup2:

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

Oto jak będzie wyglądać w Horizon:

../_images/installed_mybackup2.png

Dodajmy jeszcze dwie kopie zapasowe. Pierwsza z nich powinna tworzyć kopie zapasowe wszystkich obiektów api w przestrzeni nazw velero:

velero backup create mybackup3 --include-namespaces velero

Drugi wykona kopię zapasową wszystkich obiektów api w domyślnej przestrzeni nazw

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

To jest struktura magazynu obiektów po tych trzech kopiach zapasowych:

../_images/three_backups_mybackup.png

Można również użyć polecenia velero CLI, aby wyświetlić listę istniejących kopii zapasowych:

velero backup get

Oto wynik w oknie terminala:

../_images/three_backups_mybackup.png

Przykład 1 Podstawy przywracania aplikacji

Zademonstrujmy teraz, jak przywrócić aplikację Kubernetes. Najpierw sklonujmy jedną przykładową aplikację z GitHub. Wykonaj to:

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

Uruchom przykładową aplikację nginx:

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

Utwórz kopię zapasową:

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

Tak wygląda kopia zapasowa nginx-backup w Horizon:

../_images/nginx-backup.png

Symulacja katastrofy:

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

Przywróć utracone zasoby:

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>

Przykład 2 Migawka przywracania aplikacji

Uruchom przykładową aplikację nginx:

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

Utwórz kopię zapasową z migawkami PV:

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.

Symulacja katastrofy:

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

Ważne

Ponieważ domyślną zasadą odzyskiwania <https://kubernetes.io/docs/concepts/storage/persistent-volumes/#reclaiming>`_ dla dynamicznie aprowizowanych PV jest „Usuń”, polecenia te powinny spowodować, że dostawca usług w chmurze usunie dysk, na którym znajduje się kopia zapasowa PV. Usuwanie jest asynchroniczne, więc może to zająć trochę czasu.

Przywróć utracone zasoby:

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.

Usuń w kopii zapasowej Velero

Istnieją dwa sposoby usunięcia kopii zapasowej utworzonej przez Velero.

Usuń tylko kopię zapasową zasobu niestandardowego
kubectl delete backup <backupName> -n <veleroNamespace>

usunie tylko zasób niestandardowy kopii zapasowej i nie usunie żadnych powiązanych danych z magazynu obiektów/bloków.

Usunięcie wszystkich danych z pamięci obiektowej/blokującej
velero backup delete <backupName>

usunie zasób kopii zapasowej, w tym wszystkie dane w obiektowej/blokującej pamięci masowej

Usuwanie Velero z klastra

Odinstaluj Velero

Aby odinstalować wersję Velero:

helm uninstall velero-1721031498 --namespace velero

Aby usunąć przestrzeń nazw Velero

kubectl delete namespace velero

Co robić dalej

Teraz, gdy Velero jest już uruchomione, możesz zintegrować je ze swoją rutyną. Będzie on przydatny we wszystkich klasycznych scenariuszach tworzenia kopii zapasowych - do odzyskiwania po awarii, migracji klastra i przestrzeni nazw, testowania i rozwoju, wycofywania aplikacji, zgodności i audytu itp. Oprócz tych szerokich przypadków użycia, Velero pomoże w konkretnych zadaniach klastra Kubernetes związanych z tworzeniem kopii zapasowych, takich jak:

  • tworzenie kopii zapasowych i przywracanie wdrożeń, usług, map konfiguracji i wpisów tajnych,

  • selektywne kopie zapasowe, na przykład tylko dla określonych przestrzeni nazw lub selektorów etykiet,

  • kształtowanie wolumenów przy użyciu interfejsów API dostawcy usług w chmurze (AWS, Azure, GCP itp.).

  • migawki trwałych woluminów do odzyskiwania punkt w czasie

  • zapisywanie kopii zapasowych danych w AWS S3, Google Cloud Storage, Azure Blob Storage itp.

  • integracja z poleceniem kubectl, dzięki czemu niestandardowe definicje zasobów (CRD) są używane do definiowania konfiguracji kopii zapasowych i przywracania.