Платформа контейнеризации Kubernetes, как и многие другие программные продукты, обрабатывает и хранит большой объем данных от различных компонентов кластера, включая NoSQL СУБД etcd, блоки хранения данных объекта Persistent Volumes (PVs), а также различные манифесты и файлы конфигураций: deployment, ConfigMap, Secrets и т.д. Для сохранения данных важно позаботиться об организации резервного копирования.
Одним из способов создания копий является ручной метод однако, также существуют различные инструменты, облегчающие процесс создания резервных копий Kubernetes. Одним из таких инструментов является программа Velero, которая разработана специально для создания резервных копий кластера Kubernetes.
Сегодня мы подробно рассмотрим процесс создания резервных копий при помощи инструмента Velero.
Для создания резервных копий кластера Kubernetes нам потребуется следующее:
Если вы используете Kubernetes Timeweb Cloud, файл kubeconfig для подключения к кластеру можно найти на странице кластера на вкладке «Дашборд» → «Скачать»:
S3 — это объектное хранилище для надежного хранения больших данных. Так как для утилиты Velero необходимо обязательное присутствие объектного хранилища, то создадим его в разделе «Хранилище S3» в панели управления Timeweb Cloud.
Нажимаем на кнопку «Создать»:
В рамках данной статьи мы выберем минимальный объем — 10 ГБ места. В реальности вам необходимо выбирать тот размер хранилища, который будет соответствовать вашим потребностям. Тип хранилища делаем публичным. Также при необходимости можно изменить имя для бакета:
s3
Velero представляет собой клиент-серверную утилиту с открытым исходным кодом для создания резервных копий и восстановления ресурсов кластера Kubernetes. Velero работает с объектами Kubernetes (например, с такими объектами, как Pod, Deployment, Service и т.д.) и сохраняет их в виде снимков. Также она может сохранять данные из объектов типа Persistent Volume (PV).
Основные функции Velero заключаются в следующем:
Создание резервных копий: Сохранение состояния кластера Kubernetes (включая манифесты и Persistent Volume).
Восстановление данных: Восстановление всего кластера или только отдельных ресурсов из резервной копии.
Миграция данных: Перемещение ресурсов между кластерами Kubernetes.
Архитектура Velero состоит из трех следующих ключевых компонентов:
Velero Server (разворачивается внутри кластера Kubernetes)
Серверная часть Velero представляет собой контроллер, работающий как объект Deployment внутри кластера Kubernetes. Отвечает за выполнение задач резервного копирования и восстановления.
CLI (разворачивается вне кластера)
Клиентская часть Velero, представленная в виде интерфейса командной строки для управления Velero. Посылает команды серверу Velero.
Плагины для провайдеров облачного хранилища
Используются для взаимодействия с хранилищами данных (например, Amazon S3, Google Cloud Storage, Azure Blob Storage).
Прежде чем приступать к установке Velero, нам необходимо установить утилиту kubectl
для подключения и управления кластером Kubernetes. Это можно сделать по нашей инструкции.
Стоит отметить, что при использовании kubectl
версия утилиты должна совпадать с версией кластера. Используемая основная (мажорная) версия kubectl
не должна отличаться от той, которая используется в кластере. Например, если используется версия кластера под номером 1.31, то можно использовать версии с 1.30 до 1.32 Для скачивания определенной версии kubectl ее необходимо указать в URL-адресе, например:
curl -LO https://dl.k8s.io/release/v1.32.0/bin/linux/amd64/kubectl
После установки необходимо проверить, что утилита была корректно установлена, путем вывода ее версии:
kubectl version --client
Если в ответ была возвращена версия утилиты, то kubectl
успешно установлена.
Helm — это инструмент для управления пакетами Kubernetes. Он используется для упрощения установки, обновления и управления приложениями в кластере Kubernetes. Helm позволяет организовать сложные конфигурации Kubernetes в виде легко управляемых пакетов, называемых чартами (charts). Установка Helm описана в отдельной статье.
После того как установка была завершена, проверим версию программы, чтобы убедиться в корректности установки:
helm version
Для подключения к кластеру нам необходим kubeconfig
— специальный файл в формате .yaml
, в котором содержатся данные для подключения к кластеру. При использования облачного кластера Kubernetes от Timeweb Cloud, kubeconfig
можно скачать из панели управления.
Далее необходимо экспортировать переменную KUBECONFIG
, в значение которой прописыватся полный путь до файла kubeconfig
.
Linux и macOS
В терминале необходимо выполнить следующую команду:
export KUBECONFIG=/root/Daring_Linnet_config.yaml
Windows
В Windows команда будет следующей:
$env:KUBECONFIG = "C:\Users\alex\plugins\container-service\clusters\customername\Daring_Linnet_config.yaml"
Где Daring_Linnet_config.yaml
— имя файла kubeconfig
.
После того как переменная была экспортирована, можно проверить подключение к кластеру. Для этого можно вывести список всех доступных нод кластера:
kubectl get nodes
Если в ответ команда вернула список нод, то подключение к кластеру успешно установлено.
Как уже было упомянуто ранее, Velero состоит из клиентской (CLI) части и серверной. Для начала установим клиентскую часть, которая представляет собой интерфейс командной строки.
.tar
-архив с клиентской частью Velero и разархивируем его. Мы будем использовать версию 1.15.1:curl -L https://github.com/vmware-tanzu/velero/releases/download/v1.15.1/velero-v1.15.1-linux-amd64.tar.gz | tar -xz
velero-v1.15.1-linux-amd64
(где v1.15.1
— это используемая версия). Переместим директорию в /usr/local/bin
:mv velero-v1.15.1-linux-amd64/velero /usr/local/bin/
velero version
Как можно увидеть на скриншоте выше, утилита успешно отобразила ранее установленную версию. На этом установка клиентской части завершена. Далее мы перейдем к установке серверной части.
Одним из способов установки серверной части Velero является helm-чарт. Чтобы установить Velero при помощи helm-чарта, необходимо выполнить следующие шаги:
velero
:kubectl create namespace velero
В качестве секрета будут хранится значения переменных aws_access_key_id
и aws_secret_access_key
. S3 Access Key и S3 Secret Access Key — это пара уникальных ключей, которые используются для аутентификации и авторизации доступа к хранилищу S3. Эти ключи позволяют программам, скриптам и другим приложениям взаимодействовать с S3-ресурсами через AWS API, CLI или SDK.
Чтобы узнать значения S3 Access Key и S3 Secret Access Key, необходимо перейти в раздел «Хранилище S3» в панели управления Timeweb Cloud и открыть нужное хранилище. В меню справа будет отображаться вся необходимая информация, включая S3 Access Key и S3 Secret Access Key:
Копируем данные значения.
Создаем новый файл с именем velero-credentials-secret.yaml
:
nano velero-credentials-secret.yaml
Со следующим содержимым:
apiVersion: v1
kind: Secret
metadata:
name: cloud-credentials
namespace: velero
type: Opaque
stringData:
cloud: |
[default]
aws_access_key_id = UOY3beX5A3bV9Ly
aws_secret_access_key = F3x78pH1d5BOu4BfVv
kubectl apply -f velero-credentials-secret.yaml
vmware-tanzu
, где хранится Velero:helm repo add vmware-tanzu https://vmware-tanzu.github.io/helm-charts
И обновляем списки репозиториев:
helm repo update
При выводе списка репозиториев будет отображаться ранее добавленный репозиторий vmware-tanzu
:
helm repo ls
helm install velero vmware-tanzu/velero \
--namespace velero \
--set credentials.existingSecret=cloud-credentials \
--set 'configuration.backupStorageLocation[0].name=default' \
--set 'configuration.backupStorageLocation[0].provider=aws' \
--set 'configuration.backupStorageLocation[0].bucket=f60e2023-bucket-for-velero' \
--set 'configuration.backupStorageLocation[0].config.region=ru-1' \
--set 'configuration.backupStorageLocation[0].config.s3ForcePathStyle=true' \
--set 'configuration.backupStorageLocation[0].config.s3Url=https://s3.timeweb.cloud' \
--set 'configuration.volumeSnapshotLocation[0].name=default' \
--set 'configuration.volumeSnapshotLocation[0].provider=aws' \
--set 'configuration.volumeSnapshotLocation[0].config.region=ru-1' \
--set 'initContainers[0].name=velero-plugin-for-aws' \
--set 'initContainers[0].image=velero/velero-plugin-for-aws:v1.7.0' \
--set 'initContainers[0].volumeMounts[0].mountPath=/target' \
--set 'initContainers[0].volumeMounts[0].name=plugins'
В параметре configuration.backupStorageLocation[0].bucket
необходимо указать имя хранилища которое, можно получить из панели управления бакетом в параметре «Название бакета»:
Запускаем команду установки:
При отсутствии ошибок будет выведено сообщение о том, что Velero был развернут в кластере, и для отслеживания его состояния можно воспользоваться командой:
kubectl get deployment/velero -n velero
Файл deployment’а успешно запущен. Об этом говорят статусы READY и UP-TO-DATE.
Также можно проверить статус пода с Velero:
kubectl get pods -n velero
Под также успешно запущен.
При необходимости можно также проверить логи пода, где velero-7bb8d5c5f-jwg5c
— это имя пода Velero:
kubectl logs velero-7bb8d5c5f-jwg5c -n velero
На этом установка Velero полностью завершена.
Переходим к процессу резервного копирования. Для тестирования создадим новый namespace и в нем несколько объектов Kubernetes.
test-velero
:kubectl create ns test-velero
LoadBalancer
. Содержимое файла будет следующим:nano nginx-dev.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-dev
namespace: test-velero
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:1.17.6
name: nginx
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
labels:
app: nginx
name: nginx-test-service
namespace: test-velero
spec:
ports:
- port: 80
targetPort: 80
selector:
app: nginx
type: LoadBalancer
kubectl apply -f nginx-dev.yaml
Проверяем статус созданных объектов:
kubectl get all -n test-velero
test-velero
будет создана резервная копия. С помощью команды ниже мы создадим копию с именем nginx-test-backup
:velero backup create nginx-test-backup --include-namespaces test-velero
Если резервная копия была успешно создана, то в ответ пользователь увидит следующую фразу:
Backup request "nginx-test-backup" submitted successfully.
Run `velero backup describe nginx-test-backup` or `velero backup logs nginx-test-backup` for more details.
Убедимся, что резервная копия действительно была создана успешно. Для этого воспользуемся командой velero backup describe
:
velero backup describe nginx-test-backup
Как можно увидеть на скриншоте выше, резервная копия была успешно создана, о чем говорит статус Completed.
velero backup get
:velero backup get
Для каждой созданной резервной копии отображается ее статус (STATUS), количество ошибок (ERRORS), количество предупреждений (WARNINGS), дата и время создания резервной копии (CREATED) и срок жизни резервной копии (EXPIRES).
kubectl delete namespace test-velero
Далее выполняем команду восстановления velero restore create --from-backup
, указав в качестве аргумента имя ранее созданной резервной копии (nginx-test-backup
):
velero restore create --from-backup nginx-test-backup
Проверим статус восстановления при помощи команды velero restore describe
, передав в качестве значения имя восстановленной копии, которую можно узнать из вывода команды velero restore create
:
velero restore describe nginx-test-backup-20250114155656
Резервная копия была успешно восстановлена, о чем говорит ее статус — Completed.
Для просмотра файлов резервной копии можно воспользоваться разделом «Объекты» в веб-интерфейсе объектного хранилища:
Также Velero создает отдельные директории для резервных копий:
И для восстановления:
Внутри каждой директории можно увидеть соответствующие объекты, например:
Velero обладает обширным функционалом резервного копирования, позволяя делать копии только определенных объектов. Ниже приведены примеры, которые могут оказаться полезными.
default
и my-namespace
каждый день в 02:00 часа:velero schedule create daily-backup --schedule="0 2 * * *" --include-namespaces default,my-namespace
default
:velero backup create my-backup2 --include-resources deployments --include-namespaces default
ClusterRole
, ClusterRoleBinding
, CustomResourceDefinition
(CRD), PersistentVolume
, StorageClass
.velero backup create full-cluster-backup
app=nginx
:velero backup create backup-with-label-nginx --selector "app=nginx"
app=nginx
:velero backup create backup-with-no-label-nginx --selector "app=nginx"
kube-system
и всего его объекты:velero backup create backup-exclude-kube-system --exclude-namespaces kube-system
velero backup create backup-exclude-secrets --exclude-resources secrets
Выгодные тарифы на облако в Timeweb Cloud
В данной практической статье мы рассмотрели установку и использование программы Velero для создания резервных копий в кластере Kubernetes. Velero обладает богатым функционалом и позволяет быстро и просто выполнять задачи, связанные с резервным копированием.