Мигрировать в 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. Работает в любом сценарии, но медленнее.
Шаги миграции
- Подготовьте кластеры к миграции.
- Создайте хранилище для резервных копий.
- Установите Velero.
- Перенесите кластер в Managed Kubernetes.
- Опционально: удалите Velero.
1. Подготовить кластеры к миграции
-
Создайте кластер Managed Kubernetes с нужными группами нод и метками.
-
Разверните системные компоненты — удобнее всего через ваш IaC-инструмент:
- ingress-контроллер;
- cert-manager и его ClusterIssuer;
- PriorityClass;
- StorageClass — имена объектов StorageClass должны совпадать в исходном и новом кластерах. В Selectel имя StorageClass по умолчанию содержит название пула, поэтому создайте в новом кластере StorageClass с тем же именем, что в исходном, и укажите в нем нужную локацию размещения томов;
- нужные CRD (Custom Resource Definition) и операторы (например, RabbitMQ и Jaeger);
- мониторинг.
Velero может их перенести, но отдельное развертывание позволяет сразу обновить версии и навести порядок в конфигурации.
-
Если вы ограничиваете копию параметрами
--include-namespacesили--exclude-namespaces, перенесите ClusterRole вручную — они не относятся к пространствам имен и в копию не попадут. -
Убедитесь, что правила размещения подов (affinity и nodeSelector) подходят для нового кластера — например, не ссылаются на конкретные зоны. Не правьте поды вручную во время восстановления: при File System Backup пересоздание пода удалит init-контейнер Velero, который ожидает окончания восстановления данных тома.
-
Исключите из копирования тома, подключенные вручную, например NFS, S3-бакеты в режиме ReadWriteMany и подобные. Для этого добавьте в шаблон пода аннотацию с именами таких томов из его спецификации. Например:
backup.velero.io/backup-volumes-excludes=VOLUME_NAME -
Если ваши Ingress используют аннотации со сниппетами, убедитесь, что включен параметр
allowSnippetAnnotations— иначе манифесты не пройдут валидацию при восстановлении. В новых версиях ingress-nginx параметрallowSnippetAnnotationsпо умолчанию выключен.
2. Создать хранилище для резервных копий
Настроить доступ к S3 может Владелец аккаунта или пользователь с ролью iam.admin.
-
Создайте сервисного пользователя с ролью с доступом в S3. Если вы используете сервисного пользователя с ролью
s3.user,object_storage_userилиs3.bucket.user, в бакете должна быть настроена политика доступа и ее правила должны разрешать доступ этому пользователю. -
Откройте CLI.
-
Сохраните ключи сервисного пользователя в файл
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. Подробнее о разнице между способами переноса в подразделе Как устроена миграция.
Через снапшоты
Через File System Backup
-
Откройте CLI.
-
Установите 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>"Укажите:
<bucket_name>— имя бакета, созданного на шаге 2 при создании хранилища для резервных копий;<pool>— пул, в котором находятся кластеры, напримерru-6;<url>— домен S3 API, зависит от пула, в котором находится S3.
-
В созданном ресурсе VolumeSnapshotLocation смените провайдера на
openebs.io/cstor-blockstore. -
В исходном кластере настройте работу со снапшотами томов, чтобы Velero мог сам создавать снапшоты дисков и разворачивать из них тома. Подробнее — в инструкции документации Selectel о снапшотах томов.
4. Перенести кластер в Managed Kubernetes
-
Откройте CLI.
-
Остановите внесение изменений. В исходном кластере уменьшите до нуля реплики сервисов, через которые меняются конфигурация или данные приложений, - например, CI/CD-раннеров и админок. В новый кластер они переедут выключенными:
kubectl -n NAMESPACE scale deployment DEPLOYMENT_NAME --replicas=0 -
Cнимите дампы баз данных, которые работают вне кластера. Базы данных на PVC внутри кластера Velero перенесет вместе с томами.
-
Создайте резервную копию в исходном кластере. Исключите пространства имен компонентов, которые уже развернуты в новом кластере на этапе 1 при подготовке кластеров к миграции. Например:
velero backup create backup-cluster --exclude-namespaces ingress-nginx,cert-manager,monitoring -
Дождитесь, когда статус копии станет
Completed. Например:velero backup describe backup-cluster --details -
Переключитесь на новый кластер и запустите восстановление. Например:
velero restore create restore-cluster --from-backup backup-cluster -
Следите за восстановлением и состоянием подов. Например:
velero restore describe restore-cluster --detailskubectl get pods -A -
Когда все приложения поднялись, переключите трафик на новый кластер. Например, по схеме blue-green: обновите DNS-записи или конфигурацию внешнего балансировщика так, чтобы трафик шел на ноды нового кластера.
-
Включите сервисы, остановленные на шаге 2. Например:
kubectl -n NAMESPACE scale deployment DEPLOYMENT_NAME --replicas=1
5. Опционально: удалить Velero
Если Velero не нужен для регулярного резервного копирования, удалите его из обоих кластеров:
velero uninstall
Команда снимет финализаторы Velero с ресурсов и удалит его CRD. На восстановленных ресурсах временно останутся метки с именем резервной копии - они уйдут при следующем штатном развертывании приложения.