Как создать резервную копию и восстановить данные кластера DOKS с использованием Velero

Введение

Как и в любой другой среде, данные в кластере Kubernetes могут быть подвержены риску потери. Чтобы предотвратить серьезные проблемы, важно иметь план восстановления данных под рукой. Простой и эффективный способ сделать это – создать резервные копии, обеспечивая безопасность ваших данных в случае неожиданных событий. Резервные копии могут запускаться единожды или по расписанию. Хорошей практикой является наличие запланированных резервных копий, чтобы убедиться, что у вас есть последняя версия резервной копии, к которой легко можно вернуться при необходимости.

Velero – это инструмент с открытым исходным кодом, разработанный для резервного копирования и восстановления операций для кластеров Kubernetes. Он идеально подходит для случаев восстановления после катастрофы, а также для создания снимков состояния вашего приложения перед выполнением операций системы на вашем кластере, таких как обновления. Дополнительные сведения по этой теме можно найти на официальной странице Как работает Velero.

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

Содержание

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

Для завершения этого руководства вам понадобятся следующие компоненты:

  • A DO Spaces Bucket and access keys. Save the access and secret keys in a safe place for later use.
  • A DigitalOcean API token for Velero to use.
  • A Git client, to clone the Starter Kit repository.
  • Helm для управления релизами и обновления Velero.
  • Doctl для взаимодействия с API DigitalOcean.
  • Kubectl для взаимодействия с Kubernetes.
  • Клиент Velero для управления резервными копиями Velero.

Шаг 1 – Установка Velero с использованием Helm

На этом этапе вы развернете Velero и все необходимые компоненты, чтобы он мог выполнять резервное копирование ресурсов вашего кластера Kubernetes (включая PV). Резервные данные будут сохранены в бакете DO Spaces, созданном ранее в разделе Предварительные требования.

Сначала клонируйте репозиторий Git Starter Kit и перейдите в каталог вашей локальной копии:

git clone https://github.com/digitalocean/Kubernetes-Starter-Kit-Developers.git

cd Kubernetes-Starter-Kit-Developers

Затем добавьте репозиторий Helm и выведите список доступных диаграмм:

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

helm repo update vmware-tanzu

helm search repo vmware-tanzu

Вывод будет похож на следующий:

NAME                    CHART VERSION   APP VERSION     DESCRIPTION
vmware-tanzu/velero     2.29.7          1.8.1           A Helm chart for velero

Интересующей нас диаграммой является vmware-tanzu/velero, которая установит Velero в кластер. Пожалуйста, посетите страницу диаграммы Velero для получения более подробной информации о ней.

Затем откройте и проверьте файл значений Helm для Velero, предоставленный в репозитории Starter Kit, используя редактор на ваш выбор (желательно с поддержкой проверки YAML).

VELERO_CHART_VERSION="2.29.7"

code 05-setup-backup-restore/assets/manifests/velero-values-v${VELERO_CHART_VERSION}.yaml

Затем, замените соответствующим образом заполнители <> для вашего бакета Velero в DO Spaces (например, имя, регион и секреты). Убедитесь, что также предоставили свой токен API DigitalOcean (DIGITALOCEAN_TOKEN).

Наконец, установите Velero, используя helm:

VELERO_CHART_VERSION="2.29.7"

helm install velero vmware-tanzu/velero --version "${VELERO_CHART_VERSION}" \
  --namespace velero \
  --create-namespace \
  -f 05-setup-backup-restore/assets/manifests/velero-values-v${VELERO_CHART_VERSION}.yaml

A specific version of the Velero Helm chart is used. In this case 2.29.7 is picked, which maps to the 1.8.1 version of the application (see the output from Step 2.). It’s a good practice in general to lock on a specific version. This helps to have predictable results and allows versioning control via Git.

–create-namespace \

helm ls -n velero

Теперь проверьте развертывание Velero, запустив следующую команду:

NAME    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART           APP VERSION
velero  velero          1               2022-06-09 08:38:24.868664 +0300 EEST   deployed        velero-2.29.7   1.8.1

Вывод будет похож на следующий (столбец STATUS должен отображать deployed):

kubectl get deployment velero -n velero

Затем убедитесь, что Velero работает:

NAME     READY   UP-TO-DATE   AVAILABLE   AGE
velero   1/1     1            1           67s

Выходные данные выглядят примерно следующим образом (поды развертывания должны быть в состоянии Ready):

kubectl -n velero get all

Если вас интересует более подробное изучение, вы можете просмотреть серверные компоненты Velero:

  • Исследуйте страницы справки по CLI Velero, чтобы увидеть доступные команды и подкоманды. Вы можете получить справку для каждой, используя флаг --help:
  • Список всех доступных команд для Velero:

Список опций команды backup для Velero:

Velero использует несколько CRD (определений пользовательских ресурсов), чтобы представлять свои ресурсы, такие как резервные копии, расписания резервного копирования и т. д. Вы узнаете об этом на следующих этапах учебного пособия, вместе с некоторыми базовыми примерами.

Шаг 2 – Пример резервного копирования и восстановления пространства имен

В этом шаге вы узнаете, как выполнить одноразовое резервное копирование для всего пространства имён из вашего кластера DOKS, а затем восстановить его, убедившись, что все ресурсы воссозданы. Вопросом является пространство имён ambassador.

Создание Резервной Копии Пространства Имён Ambassador

velero backup create ambassador-backup --include-namespaces ambassador

Сначала инициируйте резервное копирование:

velero backup get

Затем проверьте, что резервная копия была создана:

NAME                                       STATUS      ERRORS   WARNINGS   CREATED                          EXPIRES   STORAGE LOCATION   SELECTOR
ambassador-backup                          Completed   0        0          2021-08-25 19:33:03 +0300 EEST   29d       default            <none>

Вывод выглядит аналогично:

velero backup describe ambassador-backup --details

Затем, спустя несколько моментов, вы можете её проверить:

Name:         ambassador-backup
Namespace:    velero
Labels:       velero.io/storage-location=default
Annotations:  velero.io/source-cluster-k8s-gitversion=v1.21.2
              velero.io/source-cluster-k8s-major-version=1
              velero.io/source-cluster-k8s-minor-version=21

Phase:  Completed

Errors:    0
Warnings:  0

Namespaces:
  Included:  ambassador
  Excluded:  <none>
  ...
  • Вывод выглядит аналогично:
  • Ищите строку Phase. Она должна говорить Completed.
  • Также проверьте, чтобы ошибок не было отмечено.

Создан новый объект резервного копирования Kubernetes:

~ kubectl get backup/ambassador-backup -n velero -o yaml

apiVersion: velero.io/v1
kind: Backup
metadata:
annotations:
velero.io/source-cluster-k8s-gitversion: v1.21.2
velero.io/source-cluster-k8s-major-version: "1"
velero.io/source-cluster-k8s-minor-version: "21"
...

Наконец, посмотрите на корзину DO Spaces и проверьте, есть ли там новая папка с именем backups, которая содержит созданные активы для вашей ambassador-backup:

Удаление пространства имен и ресурсов Ambassador

kubectl delete namespace ambassador

Сначала симулируйте катастрофу, намеренно удалив пространство имен ambassador:

kubectl get namespaces

Затем проверьте, было ли удалено пространство имен (список пространств имен не должен печатать ambassador):

curl -Li http://quote.starter-kit.online/quote/

curl -Li http://echo.starter-kit.online/echo/

Наконец, убедитесь, что конечная точка службы echo и quote недоступна. Обратитесь к Создание бэкенд-служб Ambassador Edge Stack относительно используемых в учебнике Starter Kit бэкенд-приложений. Вы можете использовать curl для тестирования (или можете использовать веб-браузер):

Восстановление резервной копии пространства имен Ambassador

velero restore create --from-backup ambassador-backup

Восстановите ambassador-backup:

Важно: При удалении пространства имён ambassador также будет удален ресурс балансировщика нагрузки, связанный с сервисом ambassador. Поэтому, когда вы восстанавливаете службу ambassador, балансировщик нагрузки будет воссоздан DigitalOcean. Проблема здесь в том, что вы получите НОВЫЙ IP-адрес для вашего балансировщика нагрузки, поэтому вам нужно будет настроить записи A records, чтобы направить трафик на домены, размещенные на кластере.

Проверка восстановления пространства имён Ambassador

velero restore describe ambassador-backup

Чтобы проверить восстановление пространства имён ambassador, проверьте строку Phase из вывода команды восстановления ambassador-backup. Она должна указывать Completed (также обратите внимание на раздел Предупреждения – он сообщает, если что-то пошло не так):

kubectl get all --namespace ambassador

Затем проверьте, что все ресурсы были восстановлены для пространства имён ambassador. Ищите поды, сервисы и развёртывания ambassador.

NAME                                    READY   STATUS    RESTARTS   AGE
pod/ambassador-5bdc64f9f6-9qnz6         1/1     Running   0          18h
pod/ambassador-5bdc64f9f6-twgxb         1/1     Running   0          18h
pod/ambassador-agent-bcdd8ccc8-8pcwg    1/1     Running   0          18h
pod/ambassador-redis-64b7c668b9-jzxb5   1/1     Running   0          18h

NAME                       TYPE           CLUSTER-IP       EXTERNAL-IP      PORT(S)                      AGE
service/ambassador         LoadBalancer   10.245.74.214    159.89.215.200   80:32091/TCP,443:31423/TCP   18h
service/ambassador-admin   ClusterIP      10.245.204.189   <none>           8877/TCP,8005/TCP            18h
service/ambassador-redis   ClusterIP      10.245.180.25    <none>           6379/TCP                     18h

NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/ambassador         2/2     2            2           18h
deployment.apps/ambassador-agent   1/1     1            1           18h
deployment.apps/ambassador-redis   1/1     1            1           18h

NAME                                          DESIRED   CURRENT   READY   AGE
replicaset.apps/ambassador-5bdc64f9f6         2         2         2       18h
replicaset.apps/ambassador-agent-bcdd8ccc8    1         1         1       18h
replicaset.apps/ambassador-redis-64b7c668b9   1         1         1       18h

Вывод выглядит примерно так:

kubectl get hosts -n ambassador

Получить хосты ambassador:

NAME         HOSTNAME                   STATE   PHASE COMPLETED   PHASE PENDING   AGE
echo-host    echo.starter-kit.online    Ready                                     11m
quote-host   quote.starter-kit.online   Ready                                     11m

Вывод выглядит примерно так:

СОСТОЯНИЕ должно быть Готов, а столбец ИМЯ ХОСТА должен указывать на полностью определенное имя хоста.

kubectl get mappings -n ambassador

Получить сопоставления ambassador:

NAME                          SOURCE HOST                SOURCE PREFIX                               DEST SERVICE     STATE   REASON
ambassador-devportal                                     /documentation/                             127.0.0.1:8500
ambassador-devportal-api                                 /openapi/                                   127.0.0.1:8500
ambassador-devportal-assets                              /documentation/(assets|styles)/(.*)(.css)   127.0.0.1:8500
ambassador-devportal-demo                                /docs/                                      127.0.0.1:8500
echo-backend                  echo.starter-kit.online    /echo/                                      echo.backend
quote-backend                 quote.starter-kit.online   /quote/                                     quote.backend

Вывод похож на (обратите внимание на echo-backend, который сопоставлен с хостом echo.starter-kit.online и префиксом источника /echo/, а также на quote-backend):

curl -Li https://quote.starter-kit.online/quote/

curl -Li https://echo.starter-kit.online/echo/

Наконец, после переконфигурирования вашего балансировщика нагрузки и настроек домена DigitalOcean, пожалуйста, убедитесь, что конечная точка служб echo и quote бэкэнда – UP. См. Создание бэкэнд-служб Ambassador Edge Stack.

На следующем этапе вы симулируете катастрофу, намеренно удаляя свой кластер DOKS.

Шаг 3 – Пример резервного копирования и восстановления всего кластера

На этом этапе вы симулируете сценарий восстановления после катастрофы. Весь кластер DOKS будет удален, а затем восстановлен из предыдущей резервной копии.

Создание резервной копии кластера DOKS

velero backup create all-cluster-backup

Сначала создайте резервную копию всего кластера DOKS:

velero backup get

Затем проверьте, что резервная копия была создана и не сообщает об ошибках. Следующая команда перечисляет все доступные резервные копии:

NAME                                       STATUS      ERRORS   WARNINGS   CREATED                          EXPIRES   STORAGE LOCATION   SELECTOR
all-cluster-backup                         Completed   0        0          2021-08-25 19:43:03 +0300 EEST   29d       default            <none>

Вывод выглядит аналогично:

velero backup describe all-cluster-backup

velero backup logs all-cluster-backup

Наконец, проверьте состояние резервной копии и журналы (убедитесь, что ошибок не сообщается):

Важно: Всякий раз, когда вы уничтожаете кластер DOKS, не указывая флаг --dangerous для команды doctl, а затем восстанавливаете его, тот же балансировщик нагрузки с тем же IP-адресом воссоздается. Это означает, что вам не нужно обновлять ваши DNS-записи A DigitalOcean.
Однако, когда применяется флаг --dangerous к команде doctl, существующий балансировщик нагрузки будет уничтожен, и новый балансировщик нагрузки с новым внешним IP будет создан при восстановлении вашего контроллера входа. Поэтому, пожалуйста, убедитесь, что обновили ваши DNS-записи A DigitalOcean соответствующим образом.

Сначала удалите весь кластер DOKS (убедитесь, что заменили заполнители <> соответствующим образом).

doctl kubernetes cluster delete <DOKS_CLUSTER_NAME>

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

doctl kubernetes cluster delete <DOKS_CLUSTER_NAME> --dangerous

Или чтобы удалить кластер Kubernetes вместе с ассоциированным балансировщиком нагрузки:

Затем воссоздайте кластер, как описано в Настройте Kubernetes DigitalOcean. Важно убедиться, что количество узлов нового кластера DOKS равно или больше оригинального.

Затем установите Velero CLI и Server, как описано в разделе Предварительные требования и Шаг 1 – Установка Velero с использованием Helm соответственно. Важно использовать тот же номер версии Helm Chart.

velero restore create --from-backup all-cluster-backup

Наконец, восстановите все, выполнив следующую команду:

Проверка состояния приложений кластера DOKS

velero restore describe all-cluster-backup-<timestamp>

Сначала проверьте строку Phase вывода команды all-cluster-backup restore describe. (Замените соответствующие заполнители <>). Она должна указывать Completed.

kubectl get all --all-namespaces

Теперь проверьте все ресурсы кластера, запустив:

curl -Li http://quote.starter-kit.online/quote/

curl -Li http://echo.starter-kit.online/echo/

Теперь бэкенд-приложения должны также реагировать на HTTP-запросы. Пожалуйста, обратитесь к Создание бэкенд-сервисов Ambassador Edge Stack относительно используемых бэкенд-приложений в учебнике Starter Kit.

В следующем шаге вы узнаете, как выполнять запланированные (или автоматические) резервные копии для приложений вашего кластера DOKS.

Шаг 4 – Запланированные резервные копии

Автоматическое выполнение резервных копий по расписанию – это действительно полезная функция. Она позволяет откатиться во времени и восстановить систему до предыдущего рабочего состояния, если что-то пойдет не так.

Создание запланированной резервной копии – очень простой процесс. Ниже приведен пример для интервала 1 минута (выбрано пространство имен kube-system).

velero schedule create kube-system-minute-backup --schedule="@every 1m" --include-namespaces kube-system

Сначала создайте расписание:

schedule="*/1 * * * *"

Поддерживается также формат cronjob для Linux:

velero schedule get

Затем убедитесь, что расписание было создано:

NAME                        STATUS    CREATED                          SCHEDULE    BACKUP TTL   LAST BACKUP   SELECTOR
kube-system-minute-backup   Enabled   2021-08-26 12:37:44 +0300 EEST   @every 1m   720h0m0s     32s ago       <none>

Вывод похож на следующий:

velero backup get

Затем проверьте все резервные копии через минуту или около того:

NAME                                       STATUS      ERRORS   WARNINGS   CREATED                          EXPIRES   STORAGE LOCATION   SELECTOR
kube-system-minute-backup-20210826093916   Completed   0        0          2021-08-26 12:39:20 +0300 EEST   29d       default            <none>
kube-system-minute-backup-20210826093744   Completed   0        0          2021-08-26 12:37:44 +0300 EEST   29d       default            <none>

Вывод похож на следующий:

Проверка состояния запланированной резервной копии

velero backup describe kube-system-minute-backup-<timestamp>

Сначала проверьте строку Phase одной из резервных копий (пожалуйста, замените соответствующим образом заполнители <>). Она должна указывать Завершено.

Наконец, обратите внимание на возможные ошибки и предупреждения в вышеуказанном выводе, чтобы проверить, не произошло ли что-то не так.

Восстановление запланированного резервного копирования

Чтобы восстановить резервные копии минутой ранее, пожалуйста, следуйте тем же шагам, которые вы узнали на предыдущих этапах этого руководства. Это хороший способ потренироваться и протестировать ваше накопленное опыт.

На следующем этапе вы узнаете, как вручную или автоматически удалить определенные резервные копии, созданные вами со временем.

Шаг 5 – Удаление резервных копий

Если вам не нужны более старые резервные копии, вы можете освободить некоторые ресурсы как на кластере Kubernetes, так и в хранилище DO Spaces Velero.

Вручную удаление резервной копии

velero backup delete kube-system-minute-backup-<timestamp>

Сначала выберите резервную копию за одну минуту, например, и выполните следующую команду (замените заполнители <> соответственно):

Теперь проверьте, что его нет в выводе команды velero backup get. Он также должен быть удален из бакета DO Spaces.

Затем вы удалите несколько резервных копий одновременно, используя selector. Подкоманда velero backup delete предоставляет флаг под названием --selector. Он позволяет удалять несколько резервных копий одновременно на основе меток Kubernetes. Те же правила применяются, что и для Выбора меток Kubernetes.

velero backup get

Сначала перечислите доступные резервные копии:

NAME                                       STATUS      ERRORS   WARNINGS   CREATED                          EXPIRES   STORAGE LOCATION   SELECTOR
ambassador-backup                          Completed   0        0          2021-08-25 19:33:03 +0300 EEST   23d       default            <none>
backend-minute-backup-20210826094116       Completed   0        0          2021-08-26 12:41:16 +0300 EEST   24d       default            <none>
backend-minute-backup-20210826094016       Completed   0        0          2021-08-26 12:40:16 +0300 EEST   24d       default            <none>
backend-minute-backup-20210826093916       Completed   0        0          2021-08-26 12:39:16 +0300 EEST   24d       default            <none>
backend-minute-backup-20210826093816       Completed   0        0          2021-08-26 12:38:16 +0300 EEST   24d       default            <none>
backend-minute-backup-20210826093716       Completed   0        0          2021-08-26 12:37:16 +0300 EEST   24d       default            <none>
backend-minute-backup-20210826093616       Completed   0        0          2021-08-26 12:36:16 +0300 EEST   24d       default            <none>
backend-minute-backup-20210826093509       Completed   0        0          2021-08-26 12:35:09 +0300 EEST   24d       default            <none>

Вывод выглядит примерно так:

velero describe backup backend-minute-backup-20210826094116

Затем скажите, что хотите удалить все ресурсы с именем backend-minute-backup-*. Выберите резервную копию из списка и проверьте метки:

Name:         backend-minute-backup-20210826094116
Namespace:    velero
Labels:       velero.io/schedule-name=backend-minute-backup
              velero.io/storage-location=default
Annotations:  velero.io/source-cluster-k8s-gitversion=v1.21.2
              velero.io/source-cluster-k8s-major-version=1
              velero.io/source-cluster-k8s-minor-version=21

Phase:  Completed

Errors:    0
Warnings:  0

Namespaces:
Included:  backend
Excluded:  <none>
...

Вывод выглядит примерно так (обратите внимание на значение метки velero.io/schedule-name):

velero backup delete --selector velero.io/schedule-name=backend-minute-backup

Затем вы можете удалить все резервные копии, которые соответствуют значению backend-minute-backup метки velero.io/schedule-name:

Наконец, проверьте, что все ресурсы с именем backend-minute-backup-* исчезли из вывода команды velero backup get, а также из бакета DO Spaces.

Автоматическое удаление резервных копий по TTL

  • При создании резервной копии вы можете указать TTL (время жизни) с помощью флага --ttl. Если Velero обнаруживает, что существующий ресурс резервной копии истек, он удаляет:
  • Ресурс Backup
  • Файл резервной копии из объекта хранения в облакеstorage
  • Все снимки PersistentVolume

Все связанные Restores

Флаг TTL позволяет пользователю указать период хранения резервной копии со значением, указанным в часах, минутах и секундах в форме --ttl 24h0m0s. Если не указано, будет применено значение TTL по умолчанию – 30 дней.

velero backup create ambassador-backup-3min-ttl --ttl 0h3m0s --include-namespaces ambassador

Сначала создайте резервную копию ambassador с использованием значения TTL 3 минуты:

velero backup describe ambassador-backup-3min-ttl

Затем проверьте резервную копию ambassador:

Name:         ambassador-backup-3min-ttl
Namespace:    velero
Labels:       velero.io/storage-location=default
Annotations:  velero.io/source-cluster-k8s-gitversion=v1.21.2
              velero.io/source-cluster-k8s-major-version=1
              velero.io/source-cluster-k8s-minor-version=21

Phase:  Completed

Errors:    0
Warnings:  0

Namespaces:
Included:  ambassador
Excluded:  <none>

Resources:
Included:        *
Excluded:        <none>
Cluster-scoped:  auto

Label selector:  <none>

Storage Location:  default

Velero-Native Snapshot PVs:  auto

TTL:  3m0s
...

A new folder should be created in the DO Spaces Velero bucket as well, named ambassador-backup-3min-ttl.

Выходные данные будут похожи на следующие (обратите внимание на раздел Namespaces -> Included – он должен отображать ambassador, а поле TTL установлено в 3ms0):

Наконец, через три минуты или около того резервная копия и связанные ресурсы должны быть автоматически удалены. Вы можете проверить, что объект резервной копии был уничтожен с помощью: velero backup describe ambassador-backup-3min-ttl. Он должен завершиться ошибкой, указывающей на то, что резервная копия больше не существует. Соответствующая папка ambassador-backup-3min-ttl из ведра Velero DO Spaces также будет удалена.

velero backup delete --help

Далее вы можете изучить все доступные параметры удаления резервной копии Velero с помощью:

Заключение

В этом руководстве вы узнали, как выполнять резервное копирование однократно, а также по расписанию, и восстанавливать всё. Важно иметь запланированные резервные копии, поскольку это позволяет вернуться к предыдущему снимку в случае возникновения проблем по пути. Вы также прошли через сценарий восстановления после катастрофы.

Восстановление томов из снимков в кластерах Kubernetes

Source:
https://www.digitalocean.com/community/developer-center/how-to-backup-and-restore-data-of-a-doks-cluster-using-velero