Миграция / Режим обслуживания

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

  • Балансировка нагрузки. Перемещение виртуальных машин между узлами позволяет равномерно распределять нагрузку на серверы, обеспечивая использование ресурсов наилучшим образом.
  • Перевод узла в режим обслуживания. Виртуальные машины могут быть перемещены с узлов, которые нужно вывести из эксплуатации для выполнения планового обслуживания или обновления программного обеспечения.
  • Обновление «прошивки» виртуальных машин. Миграция позволяет обновить «прошивку» виртуальных машины, не прерывая их работу.

Запуск миграции произвольной машины

Далее рассмотрен пример миграции выбранной виртуальной машины.

Перед началом миграции проверьте текущий статус виртуальной машины с помощью следующей команды:

d8 k get vm

В результате будет выведена информация о виртуальной машине:

NAME                                   PHASE     NODE           IPADDRESS     AGE
linux-vm                              Running   virtlab-pt-1   10.66.10.14   79m

Как видно, виртуальная машина в данный момент работает на узле virtlab-pt-1.

Для выполнения миграции виртуальной машины с одного узла на другой с учетом требований по размещению, используется ресурс VirtualMachineOperation (vmop) с типом Evict.

d8 k apply -f - <<EOF
apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualMachineOperation
metadata:
  name: migrate-linux-vm-$(date +%s)
spec:
  # Имя виртуальной машины.
  virtualMachineName: linux-vm
  # Операция для миграции.
  type: Evict
EOF

После создания ресурса vmop, выполните команду:

d8 k get vm -w

В результате будет выведена информация о статусе виртуальной машины:

NAME                                   PHASE       NODE           IPADDRESS     AGE
linux-vm                              Running     virtlab-pt-1   10.66.10.14   79m
linux-vm                              Migrating   virtlab-pt-1   10.66.10.14   79m
linux-vm                              Migrating   virtlab-pt-1   10.66.10.14   79m
linux-vm                              Running     virtlab-pt-2   10.66.10.14   79m

Эта команда отображает статус виртуальной машины в процессе миграции. Она позволяет отслеживать процесс перемещения виртуальной машины с одного узла на другой.

Если необходимо прервать миграцию, удалите соответствующий ресурс vmop, пока он находится в фазе Pending или InProgress.

Режим обслуживания

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

Для перевода узла в режим обслуживания и перемещения виртуальных машин выполните следующую команду:

d8 k drain <nodename> --ignore-daemonsets --delete-emptydir-data

где <nodename> — узел, на котором предполагается выполнить работы и который должен быть освобождён от всех ресурсов (в том числе от системных).

Эта команда выполняет несколько задач:

  • эвакуирует все поды с указанного узла.
  • игнорирует DaemonSet’ы, чтобы не остановить критически важные сервисы.
  • удаляет временные данные, хранящиеся в emptyDir, освобождая ресурсы узла.

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

d8 k drain <nodename> --pod-selector vm.kubevirt.internal.virtualization.deckhouse.io/name --delete-emptydir-data

После выполнения команды d8 k drain узел перейдёт в режим обслуживания, и виртуальные машины на нём запускаться не смогут.

Чтобы вывести его из режима обслуживания, остановите выполнение команды drain (Ctrl+C), затем выполните команду:

d8 k uncordon <nodename>

Режим обслуживания, схема

Восстановление после сбоя (ColdStandby)

ColdStandby обеспечивает механизм восстановления работы виртуальной машины в случае сбоя узла, на котором она была запущена.

Для работы этого механизма необходимо выполнить следующие требования:

  • для политики запуска виртуальной машины (.spec.runPolicy) должно быть установлено одно из следующих значений: AlwaysOnUnlessStoppedManually, AlwaysOn;
  • на узлах, где запущены виртуальные машины, должен быть включён механизм fencing.

Рассмотрим, как работает механизм ColdStandby на примере:

  1. Кластер состоит из трех узлов: master, workerA и workerB. На worker-узлах включён механизм Fencing. Виртуальная машина linux-vm запущена на узле workerA.
  2. На узле workerA возникает проблема (выключилось питание, пропала сеть, и т. д.).
  3. Контроллер проверяет доступность узлов и обнаруживает, что workerA недоступен.
  4. Контроллер удаляет узел workerA из кластера.
  5. Виртуальная машина linux-vm запускается на другом подходящем узле (workerB).

Восстановление после сбоя, схема