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”:
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:
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
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:
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:
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:
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:
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.