Резервное копирование кластера Managed Service for Kubernetes в Object Storage
Данные в кластерах Managed Service for Kubernetes надежно хранятся и реплицируются в инфраструктуре Yandex Cloud. Однако в любой момент вы можете сделать резервные копии данных из групп узлов кластеров Managed Service for Kubernetes и хранить их в Yandex Object Storage или другом хранилище.
Вы можете создавать резервные копии данных из групп узлов кластера Managed Service for Kubernetes с помощью инструмента Velero
При работе с Velero, установленным вручную, вы можете использовать nfs
Из этой статьи вы узнаете, как создать резервную копию группы узлов одного кластера Managed Service for Kubernetes с помощью Velero, сохранить ее в Object Storage, а затем восстановить в группе узлов другого кластера:
- Создайте резервную копию группы узлов Managed Service for Kubernetes.
- Восстановите группу узлов другого кластера Managed Service for Kubernetes из резервной копии.
Если созданные ресурсы вам больше не нужны, удалите их.
Перед началом работы
Подготовьте инфраструктуру
-
Создайте группы безопасности для кластера Managed Service for Kubernetes и входящих в него групп узлов.
Эти группы безопасности необходимо настроить для каждого кластера и группы узлов.
Важно
От настройки групп безопасности зависит работоспособность и доступность кластера, а также запущенных в нем сервисов и приложений.
-
Создайте два кластера Managed Service for Kubernetes. При создании укажите группы безопасности, подготовленные ранее.
Один кластер Managed Service for Kubernetes будет использован, чтобы создать резервную копию данных для группы узлов, другой — чтобы восстановить данные из копии.
Если вы планируете работать с кластерами в пределах сети Yandex Cloud, выделять кластерам публичный IP-адрес не нужно. Для подключений извне предоставьте кластерам публичный адрес.
-
Создайте по группе узлов в каждом кластере. При создании выделите каждой группе публичный IP-адрес и укажите группы безопасности, подготовленные ранее.
-
Создайте сервисный аккаунт с ролью
compute.admin
на каталог для работы с Velero. -
Выдайте сервисному аккаунту права READ и WRITE к бакету в Object Storage. Для этого выполните настройки ACL бакета.
-
Создайте статический ключ доступа для сервисного аккаунта и сохраните его идентификатор и значение. Получить значение ключа снова будет невозможно.
-
Если у вас еще нет Terraform, установите его.
-
Получите данные для аутентификации. Вы можете добавить их в переменные окружения или указать далее в файле с настройками провайдера.
-
Настройте и инициализируйте провайдер. Чтобы не создавать конфигурационный файл с настройками провайдера вручную, скачайте его
. -
Поместите конфигурационный файл в отдельную рабочую директорию и укажите значения параметров. Если данные для аутентификации не были добавлены в переменные окружения, укажите их в конфигурационном файле.
-
Скачайте в ту же рабочую директорию файл конфигурации velero-backup.tf
.В этом файле описаны:
-
Сеть.
-
Два кластера Managed Service for Kubernetes и их группы узлов.
-
Сервисный аккаунт, необходимый для работы кластеров Managed Service for Kubernetes и групп узлов.
-
Группы безопасности, которые содержат необходимые правила для кластера Managed Service for Kubernetes и входящих в него групп узлов.
Эти группы безопасности будут использоваться обоими кластерами.
Важно
От настройки групп безопасности зависит работоспособность и доступность кластера, а также запущенных в нем сервисов и приложений.
-
Сервисный аккаунт с ролью
compute.admin
для работы с Velero. -
Статический ключ доступа для сервисного аккаунта, предназначенного для работы с Velero.
-
Бакет в Object Storage.
-
-
Укажите в файле
velero-backup.tf
:folder_id
— идентификатор каталога, в котором будут созданы ресурсы.k8s_version
— версию Kubernetes 1.22 или выше.zone_a_v4_cidr_blocks
— CIDR подсети, в которой будут размещены кластеры Managed Service for Kubernetes.sa_name_k8s
— имя сервисного аккаунта кластеров Managed Service for Kubernetes.sa_name_velero
— имя сервисного аккаунта для работы с Velero.storage_sa_id
— идентификатор сервисного аккаунта с рольюstorage.admin
. С помощью него будет создан бакет в Object Storage с разрешениемREAD и WRITE
в ACL для сервисного аккаунтаsa_name_velero
.bucket_name
— имя бакета в Object Storage.
-
Выполните команду
terraform init
в директории с конфигурационным файлом. Эта команда инициализирует провайдер, указанный в конфигурационных файлах, и позволяет работать с ресурсами и источниками данных провайдера. -
Проверьте корректность файлов конфигурации Terraform с помощью команды:
terraform validate
Если в файлах конфигурации есть ошибки, Terraform на них укажет.
-
Создайте необходимую инфраструктуру:
-
Выполните команду для просмотра планируемых изменений:
terraform plan
Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
-
Если вас устраивают планируемые изменения, внесите их:
-
Выполните команду:
terraform apply
-
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
В указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления
. -
-
Получите и сохраните идентификатор и значение статического ключа сервисного аккаунта, предназначенного для работы с Velero:
-
Идентификатор ключа:
terraform output -raw access_key
-
Значение ключа:
terraform output -raw secret_key
-
Выполните дополнительные настройки
-
Выберите клиентскую часть Velero
для своей платформы согласно таблице совместимости . -
Скачайте клиентскую часть Velero, распакуйте архив и установите программу. Подробнее об установке программы читайте в документации Velero
. -
Убедитесь, что клиентская часть Velero установлена. Для этого выполните команду:
velero version
Результат:
Client: Version: v1.10.3 Git commit: 18ee078dffd9345df610e0ca9f61b31124e93f50
Резервное копирование
Чтобы выполнить резервное копирование данных группы узлов Managed Service for Kubernetes:
-
Установите kubectl
и настройте его на работу с первым кластером Managed Service for Kubernetes.Если для кластера не предоставлен публичный адрес и
kubectl
настроен через внутренний адрес кластера, выполняйте командыkubectl
на ВМ Yandex Cloud, находящейся в одной сети с кластером. -
Установите приложение Velero:
Yandex Cloud MarketplaceВручнуюУстановите приложение Velero согласно инструкции. В поле Имя бакета Object Storage укажите созданный ранее бакет.
Важно
Если имя пространства имен, где установлено приложение Velero, отличается от
velero
, для всех последующих команд дополнительно используйте параметр--namespace <пространство_имен_приложения_Velero>
.-
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра
--folder-name
или--folder-id
. -
Создайте сервисный аккаунт, необходимый для работы Velero.
-
Назначьте ему роль
storage.editor
для доступа к Yandex Object Storage. -
Создайте статический ключ доступа для сервисного аккаунта в формате JSON и сохраните его в файл
sa-key.json
:yc iam access-key create \ --service-account-name=<имя_сервисного_аккаунта> \ --format=json > sa-key.json
-
Создайте файл
credentials
с данными статического ключа доступа, полученными ранее:[default] aws_access_key_id=<идентификатор_ключа> aws_secret_access_key=<секретная_часть_ключа>
-
Установите серверную часть Velero в кластер Managed Service for Kubernetes:
kubectl label volumesnapshotclasses.snapshot.storage.k8s.io yc-csi-snapclass \ velero.io/csi-volumesnapshot-class="true" && \ velero install \ --backup-location-config s3Url=https://storage.yandexcloud.net,region=ru-central1 \ --bucket <имя_бакета> \ --plugins velero/velero-plugin-for-aws:v1.5.2 \ --provider aws \ --secret-file <путь_к_файлу_credentials> \ --features=EnableCSI \ --use-volume-snapshots=true \ --snapshot-location-config region=ru-central1 \ --uploader-type=restic
Где:
--backup-location-config
— параметры хранилища резервных копий. URL-адрес хранилища Object Storage и регион.--bucket
— имя бакета Object Storage для хранения резервных копий, созданного ранее.--plugins
— образы плагина для совместимости с AWS API.--provider
— имя провайдера объектного хранилища.--secret-file
— полный путь к файлу с данными статического ключа доступа.--features
— список активных функциональных возможностей.--snapshot-location-config
— зона доступности, в которой будут размещены снимки дисков.- (опционально)
--uploader-type=restic
— включение плагина restic.
Результат:
CustomResourceDefinition/backups.velero.io: attempting to create resource CustomResourceDefinition/backups.velero.io: already exists, proceeding CustomResourceDefinition/backups.velero.io: created ... Velero is installed! ⛵ Use 'kubectl logs deployment/velero -n velero' to view the status.
-
Убедитесь, что под Velero перешел в состояние
Running
:kubectl get pods --namespace velero
-
-
Выполните резервное копирование данных с группы узлов кластера Managed Service for Kubernetes:
velero backup create my-backup
Результат:
Backup request "my-backup" submitted successfully. Run `velero backup describe my-backup` or `velero backup logs my-backup` for more details.
-
Дождитесь завершения резервного копирования. В графе
STATUS
появится значениеCompleted
.velero backup get
Результат:
NAME STATUS ERRORS WARNINGS CREATED EXPIRES STORAGE LOCATION SELECTOR my-backup Completed 0 0 2020-10-19 17:13:25 +0300 MSK 29d default <none>
Восстановление данных из резервной копии
Чтобы восстановить данные группы узлов кластера Managed Service for Kubernetes:
-
Настройте kubectl на работу со вторым кластером Managed Service for Kubernetes.
Если для кластера не предоставлен публичный адрес и
kubectl
настроен через внутренний адрес кластера, выполняйте командыkubectl
на ВМ Yandex Cloud, находящейся в одной сети с кластером. -
Установите приложение Velero:
Yandex Cloud MarketplaceВручнуюУстановите приложение Velero согласно инструкции. В поле Имя бакета Object Storage укажите созданный ранее бакет.
Важно
Если имя пространства имен, где установлено приложение Velero, отличается от
velero
, для всех последующих команд дополнительно используйте параметр--namespace <пространство_имен_приложения_Velero>
.-
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра
--folder-name
или--folder-id
. -
Создайте сервисный аккаунт, необходимый для работы Velero.
-
Назначьте ему роль
storage.editor
для доступа к Yandex Object Storage. -
Создайте статический ключ доступа для сервисного аккаунта в формате JSON и сохраните его в файл
sa-key.json
:yc iam access-key create \ --service-account-name=<имя_сервисного_аккаунта> \ --format=json > sa-key.json
-
Создайте файл
credentials
с данными статического ключа доступа, полученными ранее:[default] aws_access_key_id=<идентификатор_ключа> aws_secret_access_key=<секретная_часть_ключа>
-
Установите серверную часть Velero в кластер Managed Service for Kubernetes:
kubectl label volumesnapshotclasses.snapshot.storage.k8s.io yc-csi-snapclass \ velero.io/csi-volumesnapshot-class="true" && \ velero install \ --backup-location-config s3Url=https://storage.yandexcloud.net,region=ru-central1 \ --bucket <имя_бакета> \ --plugins velero/velero-plugin-for-aws:v1.5.2 \ --provider aws \ --secret-file <путь_к_файлу_credentials> \ --features=EnableCSI \ --use-volume-snapshots=true \ --snapshot-location-config region=ru-central1 \ --uploader-type=restic
Где:
--backup-location-config
— параметры хранилища резервных копий. URL-адрес хранилища Object Storage и регион.--bucket
— имя бакета Object Storage для хранения резервных копий, созданного ранее.--plugins
— образы плагина для совместимости с AWS API.--provider
— имя провайдера объектного хранилища.--secret-file
— полный путь к файлу с данными статического ключа доступа.--features
— список активных функциональных возможностей.--snapshot-location-config
— зона доступности, в которой будут размещены снимки дисков.- (опционально)
--uploader-type=restic
— включение плагина restic.
Результат:
CustomResourceDefinition/backups.velero.io: attempting to create resource CustomResourceDefinition/backups.velero.io: already exists, proceeding CustomResourceDefinition/backups.velero.io: created ... Velero is installed! ⛵ Use 'kubectl logs deployment/velero -n velero' to view the status.
-
Убедитесь, что под Velero перешел в состояние
Running
:kubectl get pods --namespace velero
-
-
Проверьте, что в новом кластере Managed Service for Kubernetes отображается резервная копия данных:
velero backup get
Результат:
NAME STATUS ERRORS WARNINGS CREATED EXPIRES STORAGE LOCATION SELECTOR my-backup Completed 0 0 2020-10-19 17:13:25 +0300 MSK 29d default <none>
-
Восстановите данные из резервной копии:
velero restore create my-restore \ --exclude-namespaces velero \ --from-backup my-backup
Где:
--exclude-namespaces
— список пространств имен, которые необходимо исключить из процесса восстановления.--from-backup
— имя резервной копии для восстановления.
Результат:
Restore request "my-restore" submitted successfully. Run `velero restore describe my-restore` or `velero restore logs my-restore` for more details.
-
Дождитесь завершения восстановления данных из резервной копии. В графе
STATUS
появится значениеCompleted
.velero get restore
Результат:
NAME BACKUP STATUS STARTED COMPLETED ERRORS WARNINGS CREATED SELECTOR my-restore my-backup Completed 2020-10-20 14:04:55 +0300 MSK 2020-10-20 14:05:22 +0300 MSK 0 23 2020-10-20 14:04:55 +0300 MSK <none>
Удалите созданные ресурсы
Если созданные ресурсы вам больше не нужны, удалите их:
- Удалите кластеры Managed Service for Kubernetes.
- Если вы зарезервировали для кластеров Managed Service for Kubernetes публичные статические IP-адреса, удалите их.
- Удалите бакет Object Storage.
- Удалите сервисный аккаунт для работы с Velero.
-
В терминале перейдите в директорию с планом инфраструктуры.
Важно
Убедитесь, что в директории нет Terraform-манифестов с ресурсами, которые вы хотите сохранить. Terraform удаляет все ресурсы, которые были созданы с помощью манифестов в текущей директории.
-
Удалите ресурсы:
-
Выполните команду:
terraform destroy
-
Подтвердите удаление ресурсов и дождитесь завершения операции.
Все ресурсы, которые были описаны в Terraform-манифестах, будут удалены.
-