Перейти к основному содержимому

Мигрировать в Managed Kubernetes с помощью Velero

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

Velero — утилита для резервного копирования и восстановления Kubernetes-кластеров. Она создает резервную копию ресурсов кластера и данных постоянных томов (PVC), сохраняет ее в S3-совместимое хранилище и восстанавливает в другом кластере. С ее помощью можно перенести Kubernetes-кластер в Managed Kubernetes и заодно обновиться — например, перейти с Kubernetes 1.27 на 1.29 и поднять версии ingress-контроллера и cert-manager.

Установка Velero зависит от способа миграции постоянных томов. Тома можно перенести:

  • через снапшоты дисков (CSI) - если кластеры находятся в одном пуле и сегменте пула облака. Это быстро, потому что данные не копируются через хранилище, снапшоты сразу доступны новому кластеру;
  • File System Backup (Kopia) - при переносе между сегментами пула, регионами или дата-центрами. Данные томов копируются пофайлово через S3. Работает в любом сценарии, но медленнее.

Шаги миграции

  1. Подготовьте кластеры к миграции.
  2. Создайте хранилище для резервных копий.
  3. Установите Velero.
  4. Перенесите кластер в Managed Kubernetes.
  5. Опционально: удалите Velero.

1. Подготовить кластеры к миграции

  1. Создайте кластер Managed Kubernetes с нужными группами нод и метками.

  2. Разверните системные компоненты — удобнее всего через ваш IaC-инструмент:

    • ingress-контроллер;
    • cert-manager и его ClusterIssuer;
    • PriorityClass;
    • StorageClass — имена объектов StorageClass должны совпадать в исходном и новом кластерах. В Selectel имя StorageClass по умолчанию содержит название пула, поэтому создайте в новом кластере StorageClass с тем же именем, что в исходном, и укажите в нем нужную локацию размещения томов;
    • нужные CRD (Custom Resource Definition) и операторы (например, RabbitMQ и Jaeger);
    • мониторинг.

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

  3. Если вы ограничиваете копию параметрами --include-namespaces или --exclude-namespaces, перенесите ClusterRole вручную — они не относятся к пространствам имен и в копию не попадут.

  4. Убедитесь, что правила размещения подов (affinity и nodeSelector) подходят для нового кластера — например, не ссылаются на конкретные зоны. Не правьте поды вручную во время восстановления: при File System Backup пересоздание пода удалит init-контейнер Velero, который ожидает окончания восстановления данных тома.

  5. Исключите из копирования тома, подключенные вручную, например NFS, S3-бакеты в режиме ReadWriteMany и подобные. Для этого добавьте в шаблон пода аннотацию с именами таких томов из его спецификации. Например:

    backup.velero.io/backup-volumes-excludes=VOLUME_NAME
  6. Если ваши Ingress используют аннотации со сниппетами, убедитесь, что включен параметр allowSnippetAnnotations — иначе манифесты не пройдут валидацию при восстановлении. В новых версиях ingress-nginx параметр allowSnippetAnnotations по умолчанию выключен.

2. Создать хранилище для резервных копий

Настроить доступ к S3 может Владелец аккаунта или пользователь с ролью iam.admin.

  1. Создайте бакет в S3 Selectel.

  2. Создайте сервисного пользователя с ролью с доступом в S3. Если вы используете сервисного пользователя с ролью s3.user, object_storage_user или s3.bucket.user, в бакете должна быть настроена политика доступа и ее правила должны разрешать доступ этому пользователю.

  3. Выдайте пользователю S3-ключ.

  4. Откройте CLI.

  5. Сохраните ключи сервисного пользователя в файл s3creds:

    [default]
    aws_access_key_id=<access_key>
    aws_secret_access_key=<secret_key>

    Укажите:

    • <access_key> — значение поля Access key из S3-ключа;
    • <secret_key — значение поля Secret key из S3-ключа.

3. Установите Velero

Velero устанавливается в оба кластера с одинаковой конфигурацией. Переключаться между кластерами можно через контексты kubectl (kubectl config use-context) или параметр --kubecontext в командах Velero.

Способ установки зависит от того, как вы будете переносить постоянные тома: через снапшоты или File System Backup. Подробнее о разнице между способами переноса в подразделе Как устроена миграция.

  1. Откройте CLI.

  2. Установите Velero:

    velero install \
    --features=EnableCSI \
    --plugins velero/velero-plugin-for-aws:v1.11.1,openebs/velero-plugin:3.6.0 \
    --provider aws \
    --bucket <bucket_name> \
    --velero-pod-mem-limit=1024Mi \
    --secret-file s3creds \
    --backup-location-config \
    region=<pool>,s3ForcePathStyle="true",s3Url="<url>",checksumAlgorithm="" \
    --snapshot-location-config \
    region=<pool>,s3ForcePathStyle="true",s3Url="<url>",checksumAlgorithm="",restoreAllIncrementalSnapshots="false",autoSetTargetIP="true",bucket="<bucket_name>"

    Укажите:

  3. В созданном ресурсе VolumeSnapshotLocation смените провайдера на openebs.io/cstor-blockstore.

  4. В исходном кластере настройте работу со снапшотами томов, чтобы Velero мог сам создавать снапшоты дисков и разворачивать из них тома. Подробнее — в инструкции документации Selectel о снапшотах томов.

4. Перенести кластер в Managed Kubernetes

  1. Откройте CLI.

  2. Остановите внесение изменений. В исходном кластере уменьшите до нуля реплики сервисов, через которые меняются конфигурация или данные приложений, - например, CI/CD-раннеров и админок. В новый кластер они переедут выключенными:

    kubectl -n NAMESPACE scale deployment DEPLOYMENT_NAME --replicas=0
  3. Cнимите дампы баз данных, которые работают вне кластера. Базы данных на PVC внутри кластера Velero перенесет вместе с томами.

  4. Создайте резервную копию в исходном кластере. Исключите пространства имен компонентов, которые уже развернуты в новом кластере на этапе 1 при подготовке кластеров к миграции. Например:

    velero backup create backup-cluster --exclude-namespaces ingress-nginx,cert-manager,monitoring
  5. Дождитесь, когда статус копии станет Completed. Например:

    velero backup describe backup-cluster --details
  6. Переключитесь на новый кластер и запустите восстановление. Например:

    velero restore create restore-cluster --from-backup backup-cluster
  7. Следите за восстановлением и состоянием подов. Например:

    velero restore describe restore-cluster --details
    kubectl get pods -A
  8. Когда все приложения поднялись, переключите трафик на новый кластер. Например, по схеме blue-green: обновите DNS-записи или конфигурацию внешнего балансировщика так, чтобы трафик шел на ноды нового кластера.

  9. Включите сервисы, остановленные на шаге 2. Например:

    kubectl -n NAMESPACE scale deployment DEPLOYMENT_NAME --replicas=1

5. Опционально: удалить Velero

Если Velero не нужен для регулярного резервного копирования, удалите его из обоих кластеров:

velero uninstall

Команда снимет финализаторы Velero с ресурсов и удалит его CRD. На восстановленных ресурсах временно останутся метки с именем резервной копии - они уйдут при следующем штатном развертывании приложения.