Исследования российского ИТ-рынка показывают, что компании все чаще стали выбирать Managed Kubernetes отечественных провайдеров. При этом рост спроса обусловлен не только построением облачной инфраструктуры с нуля, но и необходимостью «приземления» уже существующих ИТ-ландшафтов на российских платформах. 

Меня зовут Михаил Карцев. Я инженер по разработке и эксплуатации в VK Cloud. Мы продолжаем серию статей о правильной и безопасной миграции компонентов виртуальной инфраструктуры между облаками. В первом и втором материалах серии мы разобрались с переносом между платформами виртуальных машин, баз данных и объектных S3-хранилищ, а в этой статье разберемся с миграцией кластера Kubernetes из AWS в VK Cloud. 

Подготовка к миграции Kubernetes: основные рекомендации

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

Так, миграции Kubernetes должно предшествовать несколько этапов подготовки. 

  • Проверка инфраструктуры и зависимостей. Перед миграцией надо понимать, как K8s встроен в существующий ИТ-ландшафт, как влияет на другие сервисы и что нужно переносить на новую платформу вместе с кластером. Такой аудит нужен, чтобы понять, можно ли вообще проводить миграцию и в каких объемах она будет.

  • Проверка сети. Здесь проверяются возможности канала. Пропускная способность канала в сочетании с размером мигрируемого кластера определяет, сколько времени понадобится на переезд. Соответственно, на какой период придется сделать кластер и приложения на нем недоступными.

  • Проверка совместимости. Важно, чтобы исходный кластер и нагрузки, работающие на нем, были совместимы с кластером на целевой платформе. Обычно для проверки совместимости хватает сравнения поддерживаемых версий K8s на платформах. Если этого недостаточно, нужную информацию можно запросить у техподдержки целевой облачной платформы.

Вводные данные: исходная и целевая инфраструктура

Для наглядности разбора каждого этапа миграции мы предварительно развернули кластер K8s с названием demo-vkcloud в сервисе Amazon Elastic Kubernetes Service. 

На самом кластере мы запустили приложение Moodle — это платформа для хранения обучающих курсов VK Cloud. Приложение является продовой нагрузкой.

Примечание: подробную инструкцию по созданию кластера в Amazon EKS можно найти здесь.

Нашей целевой платформой для миграции является VK Cloud. Здесь мы тоже предварительно создали кластер, который для удобства также назвали demo-vkcloud.

Кластер пустой — на нем «крутятся» только системные поды. 

Примечание: в VK Cloud доступен сервис Cloud Containers — полностью управляемая облачная платформа. Она позволяет развертывать приложения в контейнерах в пуле вычислительных хостов и управлять этими контейнерами через K8s. Сервис позволяет быстро получать готовые кластеры Kubernetes для проектов любого размера. Подробная инструкция по созданию кластера Kubernetes — здесь.

Стек для миграции

Самый распространенный способ миграции — резервное копирование с последующим развертыванием бэкапа на целевой платформе. Такой подход — безопасный и простой. Более того, для его реализации надо минимум ресурсов и инструментов. Например, для миграции кластера Kubernetes из AWS в VK Cloud нам понадобится только:

  • Kubectl — стандартная утилита командной строки для управления кластерами Kubernetes;

  • AWS CLI — интерфейс командной строки для работы с сервисами AWS;

  • Velero — клиент-серверная утилита для резервного копирования и восстановления ресурсов кластера Kubernetes.

Примечание: в статье мы не будем отдельно останавливаться на описании порядка установки Velero — весь алгоритм уже есть в документации VK Cloud. Его можно найти здесь.

Алгоритм миграции

Итак, перейдем непосредственно к миграции кластера Kubernetes.

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

  • Подготовка хранилища

Первое, что нам нужно сделать, — создать резервную копию кластера Kubernetes, работающего в AWS. 

Для размещения бэкапа, который мы будем создавать, нужно хранилище. Причем важно, чтобы оно могло вместить кластер любого размера, поэтому для этих задач мы будем использовать бакет S3. Само S3-хранилище будем разворачивать в VK Cloud — это сделает бэкапы «ближе».

Для этого переходим в Личный кабинет VK Cloud. Заходим в раздел «Объектное хранилище» и подраздел «Бакеты». 

Нажимаем «Добавить».

Указываем название бакета и класс хранения. Выбираем Hotbox — он предпочтительнее для миграции.

  • Установка серверной части Velero

На следующем этапе подключаемся к кластеру в AWS и проверяем его доступность.

m.kartsev@m-kartsev ~/Jobs/vk/velero_test
$ export KUBECONFIG=/Users/m.kartsev/ .kube/config

m.kartsev@m-kartsev ~/Jobs/vk/velero_test
$ kubectl cluster-info
Kubernetes control plane is running at https://F97FAlE18635C488F16FDBD4E0C9F0E4.gr7.eu-central-l.eks.amazonaws.com
CoreDNS is running at https://F97FAlE18635C488F16FDBD4E0C9F0E4.gr7.eu-central-l.eks.amazonaws.сom/api/vl/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

Далее устанавливаем серверную часть Velero на Kubernetes в AWS.

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

m.kartsev@m-kartsev ~/Jobs/vk/velero_test
$ velero install \
--plug-ins \
velero/velero-plugi n-for-aws:vl.9.0 \
--provider aws \
--bucket demo-vkcloud-moodle \
--prefix data \
--secret-file ./s3_creds \
--use-volume-snapshots=false \
--backup-location-config \
region=ru-msk,s3ForcePathStyle=”true",s3Url=https://hb.ru-msk.vkcs.cloud \
--uploader-type restic \
--use-node-agent

Дожидаемся выполнения команды.

 Передаем вторую часть кода установки серверной части Velero.

m.kartsev@e-kartsev ~/Jobs/vk/velero_test
$ kubectl -n velero create secret generic openstack-cloud-credentials \ 
--from-literal OS_PROJECT_ID=$OS_PRO3ECT_ID \ 
--from-literal OS_REGION_NAME=$OS_REGION_NAME \
--from-literal OS_IDENTITY_API_VERSION=$OS_IDENTITY_API_VERSION \
--from-literal OS_PASSWORD=$OS_PASSWORD \
--from-literal OS_AUTH_URL=$OS_AUTH_URL \
--from-literal OS_USERNAME=$OS_USERNAME \
--from-literal OS_INTERFACE=$OS_INTERFACE \
--from-literal OS_FILE_OPERATION_TIMEOUT=$OS_FILE_OPERATION_TIMEOUT \ 
--from-literal OS_DOMAIN_NAME=$OS_USER_DOMAIN_NAME \ 
-о yaml

Также дожидаемся выполнения команды. Обычно на это требуется меньше минуты.

Далее патчим Velero, чтобы ограничить его потребление ресурсов для снижения нагрузки на продовый кластер — в противном случае есть риск, что Velero начнет забирать слишком много оперативной памяти и мощностей процессора.

m.kartsev@kartsev ~/Jobs/vk/velero_test
$ kubectl patch deployment velero -n velero --patch-file velero-patch-aws.yaml 
deployment.apps/velero patched

m.kartsev@m-kartsev ~/Jobs/vk/velero_test
$ kubectl patch daemonsets node-agent -n velero --patch-file velero-patch-daemonsets.yml 
daemonset.apps/node-agent patched

После этого проверяем, что Velero установлен успешно и корректно. 

  • Создание бэкапа

Передаем команду на создание резервной копии. Среди аргументов также добавляем правила для визуализации процесса бэкапа — чтобы можно было отследить все этапы. 

Примечательно, что мы добавляем в бэкап не только сам кластер, но и всю его «обвязку», включая балансировщик и упомянутое приложение moodle, которое крутится на кластере. Причем мигрируют даже актуальные конфиги.

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

На этом работа с AWS и кластером Kubernetes в нем завершена.

Восстановление резервной копии кластера в VK Cloud

  • Подключение к кластеру в VK Cloud

Передаем команду на подключение к предварительно созданному кластеру Kubernetes в VK Cloud — далее будем работать только с ним.

m.kartsev@m-kartsev ~/Jobs/vk/velero_test
$ export KUBECONFIG=/Users/m.kartsev/Downloads/demo-vkcloud_kubeconfig.yaml

m.kartsev@m-kartsev ~/Jobs/vk/velero_test 
$ kubectl cluster-info

Kubernetes control plane is running at https://89.208.211.13:6443
CoreDNS is running at https://89.208.211.13:6443/api/vl/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

Далее по аналогии в два этапа устанавливаем серверную часть Velero уже на кластер в VK Cloud. Единственное отличие на уровне кода — добавляется один плагин для работы с VK Cloud.

m.kartsev@m-kartsev ~/Jobs/vk/velero_test
$ velero install \
--plugins \
velero/velero-plugin-for-aws:vl.8.2,registry.infra.mail.ru:5010/velero/velero-plugin-mcs:vl.2.2 \
--provider aws \
--bucket demo-vkcloud-moodle \
--prefix data \
--secret-file ./s3_creds \
--use-volume-snapshots=false \
--backup-location-config \
  region=ru-msk,s3ForcePathStyle="true",s3Url=https://hb.ru-msk.vkcs.cloud \
--uploader-type restic \
--use-node-agent

Установка, как правило, занимает менее минуты.

Далее также патчим Velero. 

m.kartsev@m-kartsev ~/Jobs/vk/velero_test
$ kubectl patch deployment velero -n velero —patch-file velero-patch-aws.yaml 
deployment.apps/velero patched
m.kartsev@m-kartsev ~/Jobs/vk/velero_test
$ kubectl patch daemonsets node-agent -n velero --patch-file velero-patch-daemonsets.yml 
daemonset.apps/node-agent patched

Примечание: в VK Cloud ограничения на под устанавливаются автоматически, поэтому шаг с патчингом необязательный. Но дополнительная страховка никогда не бывает лишней. Особенно если кластер большой и мест, где может произойти «утечка» по ресурсам, много.

  • Патчинг storage class

Следующим этапом нужно пропатчить Storage-классы, которые в AWS и VK Cloud различаются. А именно, надо применить патчер, который поменяет Storage-классы с именем gp2.

m.kartsev@m-kartsev ~/Jobs/vk/velero_test
$ cat newstorage.yml
apiVersion: v1
kind: ConfigMap
metadata:
  name: change-storage-class-config
  namespace: velero
  labels:
    velero.io/plugi n-config: ""
    velero.io/change-storage-class: RestoreltemAction 
data:
  gp2: csi-ceph-hdd-gzl

Чтобы узнать значение, на которое нужно заменить текущие данные, переходим в Личный кабинет VK Cloud. Открываем раздел «Контейнеры» и подраздел «Кластеры Kubernetes». Находим кластер demo-vkcloud и переходим в него.

Открываем пункт «Ресурсы кластера».

Во вкладке с ресурсами выбираем «Хранилище». После этого станет доступен перечень всех доступных в VK Cloud storage-классов. 

Для демонстрации выбираем класс csi-ceph-hdd-gz1.

m.kartsev@m-kartsev ~/Jobs/vk/velero_test
$ cat newstorage.yml
apiVersion: v1
kind: ConfigMap
metadata:
  name: change-storage-class-config
  namespace: velero
  labels:
    velero.io/plugi n-config: ""
    velero.io/change-storage-class: RestoreltemAction 
data:
  gp2: csi-ceph-hdd-gzl

Далее передаем это значение класса в команде и применяем патч. 

mkartsev@m-kartsev ~/Jobs/vk/velero_test
$ kubectl apply -f newstorage.yml
configmap/change-storage-class-config created
  • Восстановление резервной копии

Выполняем команду backup get, чтобы проверить доступность созданной ранее резервной копии.

После проверки выполняем команду восстановления из бэкапа.

Примечание: серверная часть Velero, установленного как в AWS, так и в VK Cloud, использует единое объектное хранилище S3, развернутое в VK Cloud. Поэтому бэкап доступен обеим инсталляциям из «единой точки» без необходимости выстраивания сложной логики обращения к копии.

Дожидаемся сообщения о восстановлении резервной копии. 

Чтобы проверить успешность миграции, переходим в Личный кабинет VK Cloud. Заходим в раздел «Контейнеры» и подраздел «Кластеры Kubernetes». Находим кластер demo-vkcloud и переходим в него. Открываем пункт «Ресурсы кластера». Выбираем пространство demo-vkcloud.

Видим, что доступен под Moodle в статусе running — то есть успешно смигрировало и приложение.

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

Примечание: подробный гайд по миграции из AWS в VK Cloud баз данных и S3-хранилищ мы описали в предыдущей статье серии.

Проверка приложения

На последнем этапе миграции важно сделать приложение доступным к работе. Для этого также нужно небольшое обновление данных, а именно — изменение домена.

Выполняем команду dig moodle.demo-vkcloud.ru. и находим домен.

Сейчас он ведет в облако AWS.

Чтобы переключиться на VK Cloud, заходим в Личный кабинет облака. Здесь переходим в раздел «Контейнеры» и подраздел «Кластеры Kubernetes». Находим кластер demo-vkcloud и открываем его. Далее переходим во вкладку «Ресурсы кластера» и выбираем «Сеть».

Копируем плавающий IP-адрес, присвоенный в VK Cloud сервису Moodle.

Далее переходим в настройки DNS вашего домена. 

Примечание: В нашем случае мы использовали DNS VK Cloud, поэтому в примере будем показывать именно его. Подробнее о DNS VK Cloud и обо всех особенностях работы с ним (создании и удалении зон, квотах и других аспектах) можно узнать в официальной документации.

Итак, переходим в личный кабинет VK Cloud. Заходим в раздел DNS и подраздел «DNS-зоны». Находим домен demo-vkcloud.ru.

Открываем его. Находим А-запись для адреса moodle.demo-vkcloud.ru. 

Вызываем контекстное меню для записи и выбираем «Редактировать». 

Меняем IP-адрес на новое значение. Нажимаем «Сохранить изменения».

После завершения TTL приложение станет доступным уже по новому домену с новым IP-адресом.

Примечание: Подробнее о работе с DNS в облаке VK Cloud можно прочитать в документации.

Для проверки переходим на страницу приложения.

Логинимся и попадаем в полностью доступное приложение, в котором есть все исходные файлы.

Отличие лишь в том, что запущенное приложение развернуто уже на серверах и в DNS-зоне VK Cloud.

После этого миграцию кластера Kubernetes можно считать успешно выполненной.

Что в итоге

Описанный нами алгоритм наглядно демонстрирует, что Kubernetes-кластер можно быстро и довольно легко перенести из облака в облако. Причем для этого не нужен большой опыт, сложный стек и огромные ресурсы — достаточно понимания принципа работы k8s и облачных платформ. При этом, безусловно, определяющую роль играет не столько процесс миграции, сколько подготовка к ней — от оценки возможности переноса до подготовки ИТ-инфраструктуры на целевой платформе. 

Своей серией статей мы продемонстрировали, что миграция в облако — это не страшно. В большинстве случаев подход одинаковый даже для разных компонентов, а успех всего процесса зависит от подготовки и четкого следования рекомендациям — в таком случае довольно легко обходятся даже ограничения vendor-lock.

VK Cloud предлагает российским компаниям помощь в переходе на безопасную облачную платформу отечественного провайдера. Поможет с этим команда Professional Services — они проведут аудит инфраструктуры, подскажут решение и мигрируют существующую инфраструктуру в VK Cloud.

Комментарии (0)