<div><img src="https://top-fwz1.mail.ru/counter?id=3548135;js=na" style="position:absolute;left:-9999px;" alt="Top.Mail.Ru" /></div>
Публичное облако на базе VMware с управлением через vCloud Director

Резервное копирование в Kubernetes

Александр Бархатов
Александр Бархатов
Технический писатель
23 января 2025 г.
63
13 минут чтения
Средний рейтинг статьи: 5

Платформа контейнеризации Kubernetes, как и многие другие программные продукты, обрабатывает и хранит большой объем данных от различных компонентов кластера, включая NoSQL СУБД etcd, блоки хранения данных объекта Persistent Volumes (PVs), а также различные манифесты и файлы конфигураций: deployment, ConfigMap, Secrets и т.д. Для сохранения данных важно позаботиться об организации резервного копирования.

Одним из способов создания копий является ручной метод однако, также существуют различные инструменты, облегчающие процесс создания резервных копий Kubernetes. Одним из таких инструментов является программа Velero, которая разработана специально для создания резервных копий кластера Kubernetes.

Сегодня мы подробно рассмотрим процесс создания резервных копий при помощи инструмента Velero.

Предварительные требования

Для создания резервных копий кластера Kubernetes нам потребуется следующее:

  • Установленный и работающий кластер Kubernetes. Это может быть собственный кластер, развернутый, например, по этой инструкции, либо кластер Kubernetes в облаке Timeweb Cloud. 
  • Объектное хранилище для хранения файлов резервных копий. Мы будем использовать объектное хранилище S3 от Timeweb Cloud.
  • Отдельный сервер/виртуальная машина, рабочий/домашний компьютер с любой установленной операционной системой, с которой будет осуществляться управление кластером при помощи утилиты kubectl и производиться установка Velero. Мы будем использовать дистрибутив Ubuntu версии 24.04
  • Установленная утилита kubectl
  • Установленный пакетный менеджер helm для Kubernetes. 

Если вы используете Kubernetes Timeweb Cloud, файл kubeconfig для подключения к кластеру можно найти на странице кластера на вкладке «Дашборд» → «Скачать»:  

Image28

Создание хранилища S3

S3 — это объектное хранилище для надежного хранения больших данных. Так как для утилиты Velero необходимо обязательное присутствие объектного хранилища, то создадим его в разделе «Хранилище S3» в панели управления Timeweb Cloud.

Нажимаем на кнопку «Создать»:

Image26

В рамках данной статьи мы выберем минимальный объем — 10 ГБ места. В реальности вам необходимо выбирать тот размер хранилища, который будет соответствовать вашим потребностям. Тип хранилища делаем публичным. Также при необходимости можно изменить имя для бакета:

Image27

s3

Описание утилиты Velero

Velero представляет собой клиент-серверную утилиту с открытым исходным кодом для создания резервных копий и восстановления ресурсов кластера Kubernetes. Velero работает с объектами Kubernetes (например, с такими объектами, как Pod, Deployment, Service и т.д.) и сохраняет их в виде снимков. Также она может сохранять данные из объектов типа Persistent Volume (PV).

Основные функции Velero заключаются в следующем:

  1. Создание резервных копий: Сохранение состояния кластера Kubernetes (включая манифесты и Persistent Volume).

  2. Восстановление данных: Восстановление всего кластера или только отдельных ресурсов из резервной копии.

  3. Миграция данных: Перемещение ресурсов между кластерами Kubernetes.

Архитектура Velero

Архитектура Velero состоит из трех следующих ключевых компонентов:

  • Velero Server (разворачивается внутри кластера Kubernetes)

Серверная часть Velero представляет собой контроллер, работающий как объект Deployment внутри кластера Kubernetes. Отвечает за выполнение задач резервного копирования и восстановления.

  • CLI (разворачивается вне кластера)

Клиентская часть Velero, представленная в виде интерфейса командной строки для управления Velero. Посылает команды серверу Velero. 

  • Плагины для провайдеров облачного хранилища

Используются для взаимодействия с хранилищами данных (например, Amazon S3, Google Cloud Storage, Azure Blob Storage).

Подготовка к установке

Установка kubectl

Прежде чем приступать к установке 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

Image32

Если в ответ была возвращена версия утилиты, то kubectl успешно установлена.

Установка Helm

Helm — это инструмент для управления пакетами Kubernetes. Он используется для упрощения установки, обновления и управления приложениями в кластере Kubernetes. Helm позволяет организовать сложные конфигурации Kubernetes в виде легко управляемых пакетов, называемых чартами (charts). Установка Helm описана в отдельной статье

После того как установка была завершена, проверим версию программы, чтобы убедиться в корректности установки:

helm version

Image24

Подготовка файла kubeconfig

Для подключения к кластеру нам необходим 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

Image29

Если в ответ команда вернула список нод, то подключение к кластеру успешно установлено.

Установка Velero

Установка клиентской части

Как уже было упомянуто ранее, Velero состоит из клиентской (CLI) части и серверной. Для начала установим клиентскую часть, которая представляет собой интерфейс командной строки.

  1. Скачиваем .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
  1. На выходе будет создана директория velero-v1.15.1-linux-amd64 (где v1.15.1 — это используемая версия). Переместим директорию в /usr/local/bin:
mv velero-v1.15.1-linux-amd64/velero /usr/local/bin/
  1. Проверим работоспособность клиентской утилиты путем вывода ее версии:
velero version

Image19

Как можно увидеть на скриншоте выше, утилита успешно отобразила ранее установленную версию. На этом установка клиентской части завершена. Далее мы перейдем к установке серверной части.

Установка серверной части

Одним из способов установки серверной части Velero является helm-чарт. Чтобы установить Velero при помощи helm-чарта, необходимо выполнить следующие шаги:

  1. Заранее создаем новый namespace (пространство имен) с именем velero:
kubectl create namespace velero

Image21

  1. Создаем новый файл с объектом Kubernetes типа секрет (secret).

В качестве секрета будут хранится значения переменных 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 — секретный ключ, который используется вместе с Access Key для создания цифровой подписи запросов. Держится в секрете, так как знание этого ключа позволяет злоумышленнику получить доступ к вашим S3-ресурсам.

Чтобы узнать значения S3 Access Key и S3 Secret Access Key, необходимо перейти в раздел «Хранилище S3» в панели управления Timeweb Cloud и открыть нужное хранилище. В меню справа будет отображаться вся необходимая информация, включая S3 Access Key и S3 Secret Access Key:

Image13

Копируем данные значения.

Создаем новый файл с именем 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

Image34

  1. Создаем секрет в Kubernetes:
kubectl apply -f velero-credentials-secret.yaml

Image8

  1. Далее добавляем официальный helm-репозиторий vmware-tanzu, где хранится Velero:
helm repo add vmware-tanzu https://vmware-tanzu.github.io/helm-charts

Image23

И обновляем списки репозиториев:

helm repo update

Image20

При выводе списка репозиториев будет отображаться ранее добавленный репозиторий vmware-tanzu:

helm repo ls

Image22

  1. Команда установки Velero будет следующей:
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 необходимо указать имя хранилища которое, можно получить из панели управления бакетом в параметре «Название бакета»:

Image9

Запускаем команду установки:

Image35

При отсутствии ошибок будет выведено сообщение о том, что Velero был развернут в кластере, и для отслеживания его состояния можно воспользоваться командой:

kubectl get deployment/velero -n velero

Image6

Файл deployment’а успешно запущен. Об этом говорят статусы READY и UP-TO-DATE.

Также можно проверить статус пода с Velero:

kubectl get pods -n velero

Image1

Под также успешно запущен. 

При необходимости можно также проверить логи пода, где velero-7bb8d5c5f-jwg5c — это имя пода Velero:

kubectl logs velero-7bb8d5c5f-jwg5c -n velero

Image5

На этом установка Velero полностью завершена.

Резервное копирование при помощи Velero

Переходим к процессу резервного копирования. Для тестирования создадим новый namespace и в нем несколько объектов Kubernetes.

  1. Создаем namespace с именем test-velero:
kubectl create ns test-velero

Image7

  1. Создаем файл типа deployment, в котором укажем запуск двух контейнеров с веб-сервером Nginx. Также в этом же файле создадим сервис с типом 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

Image31

  1. Применяем файл и создаем объекты:
kubectl apply -f nginx-dev.yaml

Image15

Проверяем статус созданных объектов:

kubectl get all -n test-velero

Image11

  1. Для всех созданных объектов в namespace test-velero будет создана резервная копия. С помощью команды ниже мы создадим копию с именем nginx-test-backup:
velero backup create nginx-test-backup --include-namespaces test-velero

Image12

Если резервная копия была успешно создана, то в ответ пользователь увидит следующую фразу:

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

Image25

Как можно увидеть на скриншоте выше, резервная копия была успешно создана, о чем говорит статус Completed.

  1. Получить список всех резервных копий в хранилище можно при помощи команды velero backup get:
velero backup get

Image14

Для каждой созданной резервной копии отображается ее статус (STATUS), количество ошибок (ERRORS), количество предупреждений (WARNINGS), дата и время создания резервной копии (CREATED) и срок жизни резервной копии (EXPIRES).

  1. Теперь проверим процедуру восстановления из резервной копии. Для этого удаляем ранее созданный namespace со всеми присутствующими в нем объектами:
kubectl delete namespace test-velero

Image16

Далее выполняем команду восстановления velero restore create --from-backup, указав в качестве аргумента имя ранее созданной резервной копии (nginx-test-backup):

velero restore create --from-backup nginx-test-backup

Image18

Проверим статус восстановления при помощи команды velero restore describe, передав в качестве значения имя восстановленной копии, которую можно узнать из вывода команды velero restore create:

velero restore describe nginx-test-backup-20250114155656

Image2

Резервная копия была успешно восстановлена, о чем говорит ее статус — Completed.

Для просмотра файлов резервной копии можно воспользоваться разделом «Объекты» в веб-интерфейсе объектного хранилища:

Image33

Также Velero создает отдельные директории для резервных копий:

Image17

И для восстановления:

Image10

Внутри каждой директории можно увидеть соответствующие объекты, например:

Image4

Полезные команды для резервного копирования

Velero обладает обширным функционалом резервного копирования, позволяя делать копии только определенных объектов. Ниже приведены примеры, которые могут оказаться полезными.

  • Создание автоматической резервной копии для всех объектов в пространствах имен default и my-namespace каждый день в 02:00 часа:
velero schedule create daily-backup --schedule="0 2 * * *" --include-namespaces default,my-namespace
  • Создать резервную копию только для объектов типа deployment в пространстве имен default:
velero backup create my-backup2 --include-resources deployments --include-namespaces default
  • Сделать резервную копию всего кластера, включая объекты, которые развернуты вне пространств имен (cluster-scoped resources). К таким объектам, в частности, относят ClusterRole, ClusterRoleBinding, CustomResourceDefinition (CRD), PersistentVolume, StorageClass.
velero backup create full-cluster-backup
  • Сделать резервную копию только тех объектов, которые совпадают по селекторам меток (label selector); например, будут сохранены только те объекты, у которых селектор будет app=nginx:
velero backup create backup-with-label-nginx --selector "app=nginx"
  • Сделать резервную копию только тех объектов, которые не совпадают по селекторам меток (label selector). Например, так можно сохранить только те объекты, у которых селектор не равен 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
  • Исключить из резервной копии все секреты (secrets):
velero backup create backup-exclude-secrets --exclude-resources secrets
Выгодные тарифы на облако в Timeweb Cloud

Заключение

В данной практической статье мы рассмотрели установку и использование программы Velero для создания резервных копий в кластере Kubernetes. Velero обладает богатым функционалом и позволяет быстро и просто выполнять задачи, связанные с резервным копированием.

Хотите внести свой вклад?
Участвуйте в нашей контент-программе за
вознаграждение или запросите нужную вам инструкцию
img-server
23 января 2025 г.
63
13 минут чтения
Средний рейтинг статьи: 5
Пока нет комментариев