Миграция из публичного облака в Managed Service for Kubernetes
В этом руководстве описан перенос рабочих нагрузок Kubernetes из управляемого сервиса другого облачного провайдера в Managed Service for Kubernetes.
Ключевой принцип миграции — поэтапный перенос с параллельной работой кластеров. Это позволяет минимизировать влияние на production-сервисы и сохранить возможность отката.
Чтобы перенести рабочие нагрузки в Managed Service for Kubernetes:
- Разработайте план миграции.
- Подготовьте инфраструктуру Yandex Cloud.
- Перенесите образы контейнеров.
- Перенесите stateful-нагрузки.
- Перенесите stateless-нагрузки.
- Настройте балансировщики и переключите DNS.
- Завершите миграцию.
Необходимые платные ресурсы
- Мастер Managed Service for Kubernetes (тарифы Managed Service for Kubernetes).
- Узлы кластера Managed Service for Kubernetes: использование вычислительных ресурсов и хранилища (тарифы Yandex Compute Cloud).
- Публичные IP-адреса для мастера и узлов кластера Managed Service for Kubernetes, если для них включен публичный доступ (тарифы Yandex Virtual Private Cloud).
- Каждый активный L7-балансировщик, если используется контроллер Gwin: использование вычислительных ресурсов (тарифы Application Load Balancer).
- Каждый сетевой балансировщик, если используются Service типа
LoadBalancer: обработанный балансировщиком входящий и исходящий трафик (тарифы Yandex Network Load Balancer). - Сервис Container Registry: хранение перенесенных Docker-образов (тарифы Container Registry).
- Бакет Object Storage: использование хранилища и выполнение операций с данными (тарифы Yandex Object Storage).
- Трансферы Data Transfer, если используется перенос управляемых баз данных (тарифы Yandex Data Transfer).
Перед началом работы
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVEилиTRIAL_ACTIVE. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Разработайте план миграции
Перед миграцией важно провести инвентаризацию рабочих нагрузок, оценить совместимость исходного и целевого кластеров, чтобы получить представление о сложности миграции, определить порядок переноса сервисов и план отката на случай критических проблем.
Проведите инвентаризацию рабочих нагрузок
Получите список ресурсов исходного кластера для всех пространств имен — приложения, версии, зависимости, сетевые правила. Заранее ознакомьтесь с полным планом миграции, чтобы определить последовательность переноса ресурсов.
Убедитесь, что все stateful-нагрузки — управляемые базы данных, StatefulSets с PersistentVolume — имеют актуальные резервные копии.
Команда для выгрузки полного списка ресурсов из исходного кластера:
for ns in $(kubectl get ns --no-headers -o custom-columns=':metadata.name'); do
echo "=== Namespace: $ns ==="
kubectl get deploy,sts,ds,job,cronjob,svc,ingress,pvc,cm,secret,hpa,pdb -n $ns
done
Чек-лист инвентаризации:
|
Ресурс |
Что зафиксировать |
|
Deployments, StatefulSets, DaemonSets, Jobs, CronJobs |
Количество, namespace, образы |
|
PersistentVolumeClaim |
Размер, StorageClass, режим доступа (RWO/RWX) |
|
Services типа LoadBalancer |
Внешние IP, DNS-имена |
|
Ingress / HTTPRoute |
Хосты, TLS, IngressClass или GatewayClass |
|
ConfigMap и Secret |
Список |
|
CustomResourceDefinitions и Operators |
Список установленных CRD и операторов |
Оцените совместимость
Чтобы компоненты кластера корректно работали после миграции, предварительно оцените их совместимость с целевым кластером. Составьте список изменений, которые нужно внести в манифесты, а также план замены несовместимых компонентов исходного кластера на аналогичные в Yandex Cloud.
Объем изменений зависит от разницы версий Kubernetes в исходном и целевом кластерах. Чем больше разница, тем больше изменений потребуется — могут отличаться как вендор-специфичные CRD, так и стандартные API-группы Kubernetes. Поддерживаемые версии смотрите в разделе Поддержка версий Kubernetes.
Совет
API-ресурсы можно сравнить командой kubectl api-resources на исходном и целевом кластерах, а также использовать утилиту для проверки совместимости манифестов kube-no-trouble (kubent)
При оценке особенно обратите внимание на следующие моменты:
- Проверьте наличие вендор-специфичных CRD исходного кластера, которые могут быть недоступны в Yandex Cloud. Замените компоненты сервисами Yandex Cloud или решениями из Yandex Cloud Marketplace.
- PodSecurityPolicy удалены в Kubernetes версий 1.25 и выше. Если вы используете PodSecurityPolicy в исходном кластере, мигрируйте на PodSecurity Admission
. - В манифестах замените классы хранилищ (
storageClassName) на те, которые поддерживаются в Managed Service for Kubernetes. - Для L7-балансировки рекомендуется использовать контроллер Gwin.
Составьте план переноса сервисов
Определите порядок переноса сервисов — начинайте с наименее критичных, заканчивайте production-нагрузками. Для переключения трафика используйте стратегию сине-зеленого развертывания
Учитывайте следующие критические моменты:
- Проведите полный цикл миграции на staging-среде перед переносом в production.
- Подготовьте план отката на случай критических проблем и согласуйте его с командой заранее.
- Координируйте работу с командами разработки и поддержки на всех этапах.
- Выберите часы минимальной нагрузки для выполнения миграции.
- Следите за метриками до, во время и после миграции с помощью Yandex Monitoring.
Подготовьте инфраструктуру Yandex Cloud
Подготовьте целевую среду в Yandex Cloud для переноса нагрузок.
Настройте доступы и права
Создайте сервисные аккаунты для управления ресурсами кластера и рабочих узлов и назначьте им роли.
Какие роли могут потребоваться?
Для управления кластером:
k8s.clusters.agentk8s.tunnelClusters.agent— вместоk8s.clusters.agent, если кластер создается в режиме туннелирования.
Подробнее о ролях Managed Service for Kubernetes.
Для управления сетевыми ресурсами:
vpc.publicAdminvpc.privateAdminvpc.uservpc.bridgeAdmin— если VPC находится в другом каталоге.
Подробнее о ролях VPC.
Для работы с образами:
container-registry.images.pullercloud-registry.artifacts.puller— если Cloud Registry используется как альтернатива Container Registry.
Подробнее о ролях Container Registry и ролях Cloud Registry.
Если используется шифрование секретов:
kms.keys.encrypterDecrypter
Подробнее о ролях KMS.
Если используется Object Storage для резервного копирования:
storage.editor
Подробнее о ролях Object Storage.
Создайте сетевую инфраструктуру
Настройте сетевую инфраструктуру, необходимую для работы кластера, — изолированную сеть с настроенными правилами безопасности для всех типов трафика кластера.
- Создайте VPC и подсети в трех зонах для обеспечения высокой доступности.
- Создайте группы безопасности для изоляции трафика кластера, узлов и входящих соединений. Всего создается пять групп.
Создайте кластер Managed Service for Kubernetes
- Создайте кластер Managed Service for Kubernetes. Выбирайте версию Kubernetes не ниже версии в исходном кластере.
- Создайте группу узлов в каждой зоне доступности.
Перенесите образы контейнеров
Последовательно перенесите образы контейнеров в Yandex Container Registry с сохранением тегов и метаданных.
В качестве альтернативного сервиса для хранения образов можно использовать Yandex Cloud Registry. В отличие от Yandex Container Registry, Cloud Registry предназначен для хранения не только Docker-образов, но и других типов артефактов.
Перенесите stateful-нагрузки
Перенос stateful-нагрузок — управляемых баз данных, StatefulSets с PersistentVolumes — является самым сложным шагом миграции, так как они хранят данные и их нельзя пересоздать без потерь.
Важно
Убедитесь, что все stateful-нагрузки — управляемые базы данных, StatefulSets с PersistentVolume — имеют актуальные резервные копии.
Перенесите управляемые базы данных
Для переноса управляемых баз данных используйте Yandex Data Transfer. Сервис позволяет перенести данные с сохранением рабочего состояния источника и минимизировать время простоя для использующих его приложений.
Проверьте в матрице трансферов, что для вашей комбинации источника и приемника поддерживается трансфер типа Копирование и репликация, и выполните миграцию в соответствии с руководством для вашей базы данных.
Примечание
Убедитесь, что открыт сетевой доступ от Data Transfer до базы данных источника. Актуальные диапазоны IP-адресов Data Transfer смотрите в документации сервиса.
Если Data Transfer не поддерживает нужный источник или требуется больший контроль, ознакомьтесь с документацией управляемых баз данных, куда запланирована миграция.
Перенесите StatefulSets с PersistentVolumes
Для переноса StatefulSets с PersistentVolumes используйте Veleronode-agent (бывший kopia). Этот способ работает с любыми PVC и не зависит от CSI-провайдера.
Совет
Если объем данных меньше 50 ГБ или Velero недоступен, можно перенести данные вручную с помощью rsync. Для этого потребуется прямая сетевая связность между кластерами.
Порядок действий:
-
Создайте бакет в Yandex Object Storage для хранения резервных копий.
-
Создайте файл
credentials-veleroс данными статического ключа доступа для сервисного аккаунта, имеющего доступ к бакету:[default] aws_access_key_id = <идентификатор_ключа> aws_secret_access_key = <секретный_ключ> -
Установите Velero CLI
на машину, с которой будет выполняться перенос и естьkubectl-доступ к исходному и целевому кластерам.Совет
Версия плагина
velero-plugin-for-awsв командах ниже может быть устаревшей. Актуальную версию смотрите в документации Velero . -
Установите Velero в исходном кластере:
-
Убедитесь, что активен контекст исходного кластера:
kubectl config current-context -
Создайте пространство имен для Velero:
kubectl create namespace velero -
Установите Velero:
velero install \ --provider aws \ --plugins velero/velero-plugin-for-aws:v1.14.0 \ --bucket <имя_бакета> \ --secret-file ./credentials-velero \ --backup-location-config \ region=ru-central1,s3ForcePathStyle=true,s3Url=https://storage.yandexcloud.net \ --use-volume-snapshots=false \ --use-node-agent \ --uploader-type=kopiaГде:
--provider aws— использует плагин AWS, совместимый с Object Storage.--use-node-agent— включает DaemonSet для резервного копирования файловой системы.--uploader-type=kopia— рекомендуемый загрузчик, работает быстрее restic.--use-volume-snapshots=false— отключает CSI-снапшоты, данные переносятся через kopia.
-
Проверьте статус компонентов:
kubectl get pods -n velero kubectl get backupstoragelocation -n velero velero backup-location getBackupStorageLocationдолжен перейти в статусAvailable.
-
-
Создайте резервную копию нужных пространств имен:
velero backup create migration-backup \ --include-namespaces <пространство_имен> \ --default-volumes-to-fs-backup \ --waitПроверить статус и логи можно командами:
velero backup describe migration-backup --details velero backup logs migration-backup -
Установите Velero в целевом кластере Managed Service for Kubernetes:
-
Переключитесь на контекст целевого кластера:
kubectl config use-context <контекст_целевого_кластера> -
Создайте пространство имен для Velero:
kubectl create namespace velero -
Установите Velero с теми же параметрами, что и в исходном кластере, указав тот же бакет:
velero install \ --provider aws \ --plugins velero/velero-plugin-for-aws:v1.14.0 \ --bucket <имя_бакета> \ --secret-file ./credentials-velero \ --backup-location-config \ region=ru-central1,s3ForcePathStyle=true,s3Url=https://storage.yandexcloud.net \ --use-volume-snapshots=false \ --use-node-agent \ --uploader-type=kopia -
Убедитесь, что резервная копия из исходного кластера видна в целевом:
kubectl get pods -n velero velero backup-location get velero backup getBackupStorageLocationдолжен перейти в статусAvailable, а резервная копияmigration-backup— в статусCompleted.
-
-
Восстановите данные из резервной копии:
velero restore create \ --from-backup migration-backup \ --waitПроверить статус и логи можно командами:
velero restore describe migration-backup --details velero restore logs migration-backupСовет
Если StorageClass в исходном кластере и Managed Service for Kubernetes называются по-разному, создайте ConfigMap с маппингом StorageClass до запуска восстановления:
apiVersion: v1 kind: ConfigMap metadata: name: change-storage-class-config namespace: velero labels: velero.io/plugin-config: "" velero.io/change-storage-class: RestoreItemAction data: <исходный_storage_class>: yc-network-ssd
Перенесите stateless-нагрузки
Для переноса stateless-нагрузок экспортируйте манифесты исходного кластера, адаптируйте для применения в Yandex Cloud и примените в целевом кластере.
Чек-лист адаптации манифестов:
- Вендор-специфичные CRD заменены сервисами Yandex Cloud или решениями из Yandex Cloud Marketplace.
- Устаревшие
apiVersionзаменены на актуальные для целевой версии Kubernetes. - Контроллер Gwin (
gwin-default) используется вingressClassNameиgatewayClassName. - Аннотации ресурсов для настройки балансировщика нагрузки заменены на аннотации Yandex Cloud.
- Ссылки на образы ведут в Yandex Container Registry (
cr.yandex/<id>/...).
Для очистки манифестов можно использовать утилиту kubectl-neat
Настройте балансировщики и переключите DNS
Переключите трафик на новый кластер.
Managed Service for Kubernetes поддерживает два способа балансировки:
- Gwin.
- Network Load Balancer — создается автоматически для Service типа
LoadBalancer.
Порядок переключения трафика:
- Разверните Gateway или Ingress-ресурсы в кластере Managed Service for Kubernetes.
- Получите внешние IP-адреса новых балансировщиков.
- Проверьте работу сервисов через тестовые DNS-записи.
- Снизьте TTL production DNS-записей заранее, затем поэтапно обновите их.
- Следите за распространением DNS и обновлением TLS-сертификатов.
Совет
Если после переключения DNS обнаружены критические проблемы, верните DNS-записи на прежние IP-адреса. Исходный кластер должен оставаться в рабочем состоянии до истечения всех TTL и подтверждения успешной миграции.
Завершите миграцию
Завершите миграцию и оптимизируйте конфигурацию.
- Убедитесь, что все сервисы работают корректно в Managed Service for Kubernetes.
- Проверьте метрики и производительность в Yandex Monitoring.
- Отключите ресурсы в исходном облаке после подтверждения стабильной работы.
- Оптимизируйте конфигурацию кластера под реальную нагрузку.
- Удалите промежуточные ресурсы: бакет Velero, трансферы Data Transfer, VPN-туннели, временные учетные данные.