Перенос рабочей нагрузки после миграции ресурсов
Это руководство поможет вам завершить перенос своей рабочей нагрузки (workload) после того, как сотрудники VK Cloud завершат работы по миграции ресурсов кластера между зонами доступности. Вы выполните следующие шаги:
- Определите, зависит ли ваша рабочая нагрузка (workload) от старой зоны доступности, так как в таком случае метаданные вашей рабочей нагрузки продолжат ссылаться на нее.
- Адаптируете рабочую нагрузку на уже смигрированных группах worker-узлов под новую зону доступности.
- Перенесете stateful-нагрузку на новые PVC.
- Если привязка к зоне доступности была установлена в helm-чартах или при настройке аддонов, обновите эти значения на новую зону доступности.
-
Перейдите в кластер Kubernetes, ресурсы которого были перенесены на другую зону доступности.
-
Установите и настройте
kubectl, если это еще не сделано. -
Подключитесь к кластеру при помощи
kubectl. -
(Опционально) Установите утилиту для переименования PVC
rename-pvc.
Определите, повлияет ли миграция на рабочую нагрузку (workload) ваших кластеров. Для этого узнайте, указана ли зона доступности:
-
в правилах планирования пода:
- в параметрах
nodeAffinity,topologySpreadConstraintsилиnodeSelector; - в метках
topology.kubernetes.io/zone,failure-domain.beta.kubernetes.io/zoneиtopology.cinder.csi.openstack.org/zone.
- в параметрах
-
в классе хранения (
StorageClass) для подов StatefulSet.
Если зона доступности не указана, миграция на другую зону доступности никак не повлияет на вашу рабочую нагрузку и дополнительных действий по переносу от вас не потребуется.
-
Дождитесь окончания работ по миграции ресурсов со стороны VK Cloud.
Узлы смигрированных групп worker-узлов (то есть тех, которые были созданы до миграции) будут иметь следующие метки, указывающие на старую зону доступности:
topology.kubernetes.io/zone,failure-domain.beta.kubernetes.io/zone.
Эти метки необходимо обновить, так как сам узел физически будет находиться уже в новой зоне доступности.
Метку
topology.cinder.csi.openstack.org/zoneобновлять не нужно: в ней новая зона доступности будет установлена для узлов, созданных как до, так и после миграции. -
Обновите зоны доступности в метках:
Для отдельных узловДля всех узловkubectl label node ≠ \topology.kubernetes.io/zone=<НОВАЯ_ЗОНА_ДОСТУПНОСТИ> \failure-domain.beta.kubernetes.io/zone=<НОВАЯ_ЗОНА_ДОСТУПНОСТИ> \--overwriteЗдесь
<НОВАЯ_ЗОНА_ДОСТУПНОСТИ>— зона доступности после миграции.
Так как работы по миграции ресурсов со стороны VK Cloud уже завершены, диски, на которых расположены PV, уже физически изменили свою зону. Теперь вам нужно актуализировать их метаданные в кластере.
Чтобы перенести stateful-нагрузку на PVC в новой зоне доступности,
Чтобы предотвратить случайное удаление данных с PVC при переносе нагрузки:
-
Поменяйте политику освобождения (reclaim policy) PV на
Retain:pv_name=$(kubectl get pvc <ИМЯ_PVC> -n <ПРОСТРАНСТВО_ИМЕН_PVC> -o jsonpath='{.spec.volumeName}')kubectl patch pv "$pv_name" -n <ПРОСТРАНСТВО_ИМЕН_PVC> -p '{"spec": {"persistentVolumeReclaimPolicy": "Retain"}}'Здесь:
<ИМЯ_PVC>— имя PVC, который вы хотите перенести.<ПРОСТРАНСТВО_ИМЕН_PVC>— пространство имен, в котором PVC расположен.
-
Клонируйте диск, связанный с PVC.
-
(Опционально) Сохраните старый PVC до окончания работ по миграции, переименовав его в
<ИМЯ_PVC>-old, чтобы иметь возможность вернуться к нему при необходимости.Когда будете создавать новый PVC, используйте
<ИМЯ_PVC>— так он получит имя оригинального смигрированного.Вы можете переименовать PVC вручную или с помощью утилиты
rename-pvc. Пример команды дляrename-pvc:rename-pvc -n <ПРОСТРАНСТВО_ИМЕН_PVC> <СТАРОЕ_ИМЯ_PVC> <НОВОЕ_ИМЯ_PVC>
Доступны несколько способов переноса PVC:
- с помощью снимка диска (через личный кабинет VK Cloud или через плагин Cinder CSI);
- с помощью утилиты
pv-migrate; - с помощью ID диска.
-
Перейдите в личный кабинет VK Cloud.
-
Создайте снимок диска, связанного с PVC.
-
Создайте новый диск на основе этого снимка, указав следующие параметры:
- Источник: снимок диска, созданный на предыдущем шаге;
- Зона доступности: зона доступности, куда выполняется миграция.
- Остальные параметры укажите по своему усмотрению.
-
Дождитесь создания диска и запомните его ID.
-
Создайте PV, ссылающийся на ID созданного из снимка диска, и PVC на его основе:
-
Дождитесь, пока созданный PV будет в статусе
Bound. -
Переведите соответствующую рабочую нагрузку на новый PVC.
-
Запустите рабочую нагрузку и убедитесь, что после миграции она работает корректно.
-
Проверьте, была ли привязка к зонам доступности дополнительно установлена через Helm-чарты или при редактировании кода аддона в личном кабинете VK Cloud.
-
Если да, вручную укажите для них зону доступности, куда была выполнена миграция. Это нужно, чтобы при следующем обновлении манифестов результаты миграции не были перезаписаны.
Helm-чартыАддоны-
Укажите зону доступности, куда была выполнена миграция, в
values.yaml:topology:zone: <ЗОНА_ДОСТУПНОСТИ> -
Примените обновление. Подробнее в официальной документации Helm.
-
Если вы управляете ресурсами кластера через Terraform, после переноса кластера синхронизируйте Terraform State с фактической инфраструктурой:
-
Добавьте в ресурс кластера
vkcs_kubernetes_clusterблокlifecycle:lifecycle {prevent_destroy = true}Это предотвратит пересоздание или удаление кластера, если в файле конфигурации или Terraform State останутся несинхронизированные поля.
-
Привяжите кластер к ресурсу
vkcs_kubernetes_cluster, используя данные из файла конфигурации Terraform:terraform import vkcs_kubernetes_cluster.<ИМЯ_РЕСУРСА> <ID_КЛАСТЕРА> -
Привяжите каждую группу узлов к ресурсу
vkcs_kubernetes_node_group:terraform import vkcs_kubernetes_node_group.<ИМЯ_РЕСУРСА> <ID_ГРУППЫ_УЗЛОВ> -
Посмотрите, какие параметры появились у новых ресурсов, и добавьте их в файл конфигурации Terraform:
terraform state show <РЕСУРС>.<ИМЯ_РЕСУРСА> -
Если в группе узлов включено автомасштабирование, значение параметра
node_countиз файла Terraform может расходиться с реально используемым количеством узлов. Добавьте блокlifecycleв ресурс группы узлов:lifecycle {ignore_changes = [node_count]}Так Terraform не будет отслеживать изменения параметра
node_count, которое автоматически меняется при автомасштабировании. -
Сгенерируйте файл изменений и убедитесь, что он не содержит указаний на пересоздание ресурсов:
terraform planЕсли вывод команды показывает
No changes, то файл конфигурации и Terraform State полностью синхронизированы. Если вывод все еще показывает изменения, продолжайте синхронизацию до тех пор, пока вывод команды не покажетNo changes.Если вывод команды предлагает операции пересоздания ресурса по полям
availability_zoneилиavailability_zones:-
Узнайте актуальное значение поля в конфигурации с помощью команды:
terraform state show <РЕСУРС>.<ИМЯ_РЕСУРСА> -
Обновите значение в файле конфигурации Terraform.
-
-
Удалите ранее добавленный блок
lifecycleс параметромprevent_destroy = trueиз ресурса кластера.
Подробнее в разделе Использование Terraform и документации Terraform-провайдера.
Работающие ресурсы в кластере тарифицируются и потребляют вычислительные ресурсы. Если вы не планируете использовать PVC и снимки диска, оставшиеся после миграции, а также саму зону доступности, удалите их и связанные с ними ресурсы:
-
Удалите старый PVC и снимки диска.
-
Удалите класс хранения (StorageClass) старой зоны доступности:
kubectl get sc -o name | grep <СТАРАЯ_ЗОНА_ДОСТУПНОСТИ> | xargs -I {} kubectl delete {}Здесь
<СТАРАЯ_ЗОНА_ДОСТУПНОСТИ>— имя зоны доступности, из которой была проведена миграция, указанная в нижнем регистре.