Снимки позволяют зафиксировать текущее состояние ресурса для последующего восстановления или клонирования. Снимок диска сохраняет только данные выбранного диска, а снимок виртуальной машины (ВМ) включает в себя параметры ВМ и состояние всех её дисков.

Консистентные снимки

Снимки могут быть консистентными и неконсистентными. За это отвечает параметр requiredConsistency, по умолчанию его значение равно true, что означает требование консистентного снимка.

Консистентный снимок фиксирует согласованное и целостное состояние данных диска. Такой снимок можно создать при выполнении одного из следующих условий:

  • диск не подключён ни к одной виртуальной машине — снимок всегда будет консистентным;
  • виртуальная машина выключена;
  • в гостевой ОС установлен и запущен qemu-guest-agent. При создании снимка он временно приостанавливает («замораживает») работу файловой системы, чтобы обеспечить согласованность данных.

Неконсистентный снимок может не отражать согласованное состояние дисков виртуальной машины и её компонентов. Такой снимок создаётся, если ВМ запущена, и в гостевой ОС не установлен или не запущен qemu-guest-agent. Если в манифесте снимка явно указан параметр requiredConsistency: false, но qemu-guest-agent при этом запущен, будет также предпринята попытка заморозки файловой системы, чтобы снимок получился консистентным.

QEMU Guest Agent поддерживает скрипты hooks, которые позволяют подготовить приложения к созданию снимка без остановки сервисов, обеспечивая согласованное состояние на уровне приложений. Настройка скриптов hooks описана в разделе «Агент гостевой ОС».

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

Создание снимков дисков

Снимок диска сохраняет его данные на момент создания и служит источником для новых дисков, например для клонирования или восстановления информации. Снимок описывает ресурс VirtualDiskSnapshot.

Целостность данных гарантирована, когда снимок создают в одном из следующих случаев:

  • Диск не подключён ни к одной виртуальной машине.
  • ВМ выключена.
  • ВМ запущена, в гостевой ОС установлен qemu-guest-agent, и файловая система успешно «заморожена» (операция fsfreeze).

Если консистентность данных не требуется (например, для тестовых сценариев), задайте в снимке параметр .spec.requiredConsistency со значением false. Тогда снимок создаётся и на работающей ВМ без «заморозки» файловой системы, в том числе когда диск подключён к ней.

Снимок диска проходит следующие фазы:

  • Pending — ожидание готовности всех зависимых ресурсов, требующихся для создания снимка.
  • InProgress — идёт процесс создания снимка виртуального диска.
  • Ready — создание снимка успешно завершено, и снимок виртуального диска доступен для использования.
  • Failed — произошла ошибка во время процесса создания снимка виртуального диска.
  • Terminating — ресурс находится в процессе удаления.

Причину проблемы с ресурсом показывает блок .status.conditions.

  • В командной строке
  • В веб-интерфейсе

Пример манифеста для создания снимка диска:

d8 k apply -f - <<EOF
apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualDiskSnapshot
metadata:
  name: linux-vm-root-snapshot
spec:
  requiredConsistency: true
  virtualDiskName: linux-vm-root
EOF

Для просмотра списка снимков дисков, выполните следующую команду:

d8 k get vdsnapshot

Пример вывода:

NAME                   PHASE     CONSISTENT   AGE
linux-vm-root-snapshot Ready     true         3m2s

Значение true в колонке CONSISTENT означает, что снимок консистентен. Оно определяется автоматически по условиям создания снимка и вручную не меняется.

  1. Перейдите на вкладку «Проекты» и выберите нужный проект.
  2. Перейдите в раздел «Виртуализация» → «Снимки дисков».
  3. Нажмите кнопку «Создать».
  4. В открывшемся окне «Создать ресурс» в поле «Имя» введите имя для снимка.
  5. На вкладке «Конфигурация» в поле «Имя виртуального диска» выберите диск, с которого будет создан снимок.
  6. Включите переключатель «Требуемая консистентность».
  7. Нажмите кнопку «Применить».
  8. Статус снимка отображается в колонке «Статус».

Восстановление дисков из снимков

Из снимка создаётся новый диск, а исходный остаётся нетронутым.

  • В командной строке
  • В веб-интерфейсе

Для того чтобы восстановить диск из ранее созданного снимка диска, необходимо в качестве dataSource указать соответствующий объект:

d8 k apply -f - <<EOF
apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualDisk
metadata:
  name: linux-vm-root
spec:
  # Настройки параметров хранения диска.
  persistentVolumeClaim:
    # Укажите размер не меньше размера исходного диска.
    size: 10Gi
    # Подставьте ваше название StorageClass.
    storageClassName: rv-thin-r2
  # Источник из которого создается диск.
  dataSource:
    type: ObjectRef
    objectRef:
      kind: VirtualDiskSnapshot
      name: linux-vm-root-snapshot
EOF
  1. Перейдите на вкладку «Проекты» и выберите нужный проект.
  2. Перейдите в раздел «Виртуализация» → «Диски».
  3. Нажмите кнопку «Создать».
  4. В открывшейся форме в поле «Имя диска» введите имя для диска.
  5. В поле «Источник» из выпадающего списка выберите снимок диска, из которого хотите восстановиться.
  6. В поле «Размер» установите размер такой же или больше, чем размер оригинального диска.
  7. В поле «Класс хранения» выберите StorageClass оригинального диска.
  8. Нажмите кнопку «Создать».
  9. Статус диска отображается на его странице.

Создание снимков ВМ

Снимок виртуальной машины — это сохранённое состояние виртуальной машины в определённый момент времени. Для создания снимков виртуальных машин используется ресурс VirtualMachineSnapshot.

Рекомендуется отключить все образы (VirtualImage/ClusterVirtualImage) от виртуальной машины перед созданием её снимка. Образы дисков не сохраняются вместе со снимком ВМ, и их отсутствие в кластере при восстановлении может привести к тому, что виртуальная машина не сможет запуститься и будет находиться в состоянии Pending, ожидая доступности образа.

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

  • не все зависимые устройства виртуальной машины готовы;
  • среди зависимых устройств есть диск, находящийся в процессе изменения размера.

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

При создании снимка динамический IP-адрес ВМ автоматически преобразуется в статический и сохраняется для восстановления. Если преобразование и использование старого адреса не нужны, задайте параметру .spec.keepIPAddress значение Never, и тогда тип адреса останется прежним (Auto или Static).

Ниже показано, как создать снимок виртуальной машины:

  • В командной строке
  • В веб-интерфейсе

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

d8 k apply -f - <<EOF
apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualMachineSnapshot
metadata:
  name: linux-vm-snapshot
spec:
  virtualMachineName: linux-vm
  requiredConsistency: true
  keepIPAddress: Never
EOF

После успешного создания снимка в его статусе отражается перечень сохранённых ресурсов.

Пример вывода:

status:
  ...
  resources:
  - apiVersion: virtualization.deckhouse.io/v1alpha2
    kind: VirtualMachine
    name: linux-vm
  - apiVersion: v1
    kind: Secret
    name: cloud-init
  - apiVersion: virtualization.deckhouse.io/v1alpha2
    kind: VirtualDisk
    name: linux-vm-root
  1. Перейдите на вкладку «Проекты» и выберите нужный проект.
  2. Перейдите в раздел «Виртуализация» → «Виртуальные машины».
  3. Из списка выберите нужную ВМ и нажмите на её имя.
  4. Перейдите на вкладку «Снимки».
  5. Нажмите кнопку «Добавить».
  6. В открывшейся форме в поле «Имя снимка» введите linux-vm-snapshot.
  7. Включите переключатель «Гарантия целостности».
  8. Нажмите кнопку «Создать».
  9. Статус снимка отображается на его странице.
  10. Созданные снимки перечислены на вкладке «Снимки» виртуальной машины с колонками «Имя», «Статус», «Дата создания» и «Консистентный».

Восстановление ВМ

Восстановление возвращает машину и её диски к состоянию, сохранённому в снимке. Запускает его ресурс VirtualMachineOperation с типом Restore, у которого есть три режима:

  • DryRun — холостой запуск операции восстановления, необходим для проверки возможных конфликтов, которые будут отображены в статусе ресурса (status.resources).
  • Strict — режим строгого восстановления, когда требуется восстановление ВМ «как в снимке», отсутствующие внешние зависимости могут привести к тому, что ВМ после восстановления будет в Pending.
  • BestEffort — отсутствующие внешние зависимости (ClusterVirtualImage, VirtualImage) игнорируются и удаляются из конфигурации ВМ.

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

  • Восстанавливаемая ВМ присутствует в кластере (ресурс VirtualMachine существует, а его .metadata.uid совпадает с идентификатором, использованным при создании снимка).
  • Восстанавливаемые диски (определяются по имени) либо не подключены к другим ВМ, либо отсутствуют в кластере.
  • Восстанавливаемый IP-адрес либо не занят другой ВМ, либо отсутствует в кластере.
  • Восстанавливаемые MAC-адреса либо не используются другими ВМ, либо отсутствуют в кластере.

Вместе с машиной восстанавливаются и её диски, поэтому в спецификации диска будет указан параметр dataSource со ссылкой на нужный снимок диска.

Если некоторые ресурсы, от которых зависит ВМ (например, VirtualMachineClass, VirtualImage, ClusterVirtualImage), отсутствуют в кластере, но существовали на момент создания снимка, ВМ после восстановления останется в состоянии Pending. В этом случае необходимо вручную отредактировать конфигурацию ВМ и обновить или удалить отсутствующие зависимости.

Не отменяйте операцию восстановления из снимка, то есть не удаляйте ресурс VirtualMachineOperation в фазе InProgress, потому что это может привести к неконсистентному состоянию восстанавливаемой виртуальной машины.

  • В командной строке
  • В веб-интерфейсе

Восстановление запускает ресурс VirtualMachineOperation с типом Restore:

apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualMachineOperation
metadata:
  name: <VMOP_NAME>
spec:
  type: Restore
  virtualMachineName: <VM_NAME>
  restore:
    mode: DryRun | Strict | BestEffort
    virtualMachineSnapshotName: <VM_SNAPSHOT_NAME>

Информацию о конфликтах при восстановлении ВМ из снимка можно посмотреть в статусе ресурса:

d8 k get vmop <VMOP_NAME> -o json | jq '.status.resources'
  1. Перейдите на вкладку «Проекты» и выберите нужный проект.
  2. Перейдите в раздел «Виртуализация» → «Виртуальные машины».
  3. Из списка выберите нужную виртуальную машину и нажмите кнопку с многоточием.
  4. В открывшемся меню выберите «Восстановить».
  5. В открывшемся окне «Восстановление машины» в поле «Имя снимка виртуальной машины» выберите снимок.
  6. В поле «Режим восстановления» выберите Strict или BestEffort.
  7. Нажмите кнопку «Восстановить».

Дополнительные ресурсы