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

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

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

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

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

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

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

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

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

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

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

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

Если консистентность данных не требуется (например, для тестовых сценариев), снимок можно создать:

  • На работающей ВМ без «заморозки» файловой системы.
  • Даже если диск подключен к активной ВМ.

Для этого в манифесте VirtualDiskSnapshot укажите:

spec:
  requiredConsistency: false

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

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

Поле CONSISTENT показывает, является ли снимок консистентным (true) или нет (false). Значение определяется автоматически на основе условий создания снимка и не может быть изменено.

После создания VirtualDiskSnapshot может находиться в следующих состояниях (фазах):

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

Диагностика проблем с ресурсом осуществляется путем анализа информации в блоке .status.conditions.

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

Как создать снимок диска в веб-интерфейсе:

  • Перейдите на вкладку «Проекты» и выберите нужный проект.
  • Перейдите в раздел «Виртуализация» → «Снимки дисков».
  • Нажмите «Создать снимок диска».
  • В поле «Имя снимка диска» введите имя для снимка.
  • На вкладке «Конфигурация» в поле «Имя диска» выберите диск, с которого будет создан снимок.
  • Включите переключатель «Гарантия целостности».
  • Нажмите кнопку «Создать».
  • Статус образа отображается слева вверху, под именем снимка.

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

Для того чтобы восстановить диск из ранее созданного снимка диска, необходимо в качестве 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

Как восстановить диск из ранее созданного снимка в веб-интерфейсе:

  • Перейдите на вкладку «Проекты» и выберите нужный проект.
  • Перейдите в раздел «Виртуализация» → «Диски ВМ».
  • Нажмите «Создать диск».
  • В открывшейся форме в поле «Имя диска» введите имя для диска.
  • В поле «Источник» убедитесь, что установлен чек-бокс «Снимки».
  • Из выпадающего списка выберите снимок диска, из которого хотите восстановиться.
  • В поле «Размер» установите размер такой же или больше, чем размер оригинального диска.
  • В поле «Имя StorageClass» введите «StorageClass» оригинального диска.
  • Нажмите кнопку «Создать».
  • Статус диска отображается слева вверху, под именем диска.

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

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

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

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

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

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

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

При создании снимка динамический IP-адрес ВМ автоматически преобразуется в статический и сохраняется для восстановления.

Если не требуется преобразование и использование старого IP-адреса виртуальной машины, можно установить соответствующую политику в значение Never. В этом случае будет использован тип адреса без преобразования (Auto или Static).

spec:
  keepIPAddress: Never

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

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

Как создать снимок ВМ в веб-интерфейсе:

  • Перейдите на вкладку «Проекты» и выберите нужный проект.
  • Перейдите в раздел «Виртуализация» → «Виртуальные машины».
  • Из списка выберите необходимую ВМ и нажмите на её имя.
  • Перейдите на вкладку «Снимки».
  • Нажмите кнопку «Создать».
  • В открывшейся форме в поле «Имя снимка» введите linux-vm-snapshot.
  • На вкладке «Конфигурация» в поле «Политика преобразования IP-адреса» выберите значение Never.
  • Включите переключатель «Гарантия целостности».
  • В поле «Класс хранилища снимка» выберите класс для снимка диска.
  • Нажмите кнопку «Создать».
  • Статус снимка отображается слева вверху, под именем снимка.

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

Для восстановления ВМ из снимка используется ресурс VirtualMachineOperation с типом restore:

apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualMachineOperation
metadata:
  name: <vmop-name>
spec:
  type: Restore
  virtualMachineName: <name of the VM to be restored>
  restore:
    mode: DryRun | Strict | BestEffort
    virtualMachineSnapshotName: <name of the VM snapshot from which to restore>

Для данной операции возможно использовать один из трех режимов:

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

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

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

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

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

d8 k get vmop <vmop-name> -o json | jq '.status.resources'

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

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

Создание клона ВМ

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

Клонируемой ВМ будет назначен новый IP-адрес для кластерной сети и MAC-адреса для дополнительных сетевых интерфейсов (если они есть), поэтому после клонирования потребуется перенастроить сетевые параметры гостевой ОС.

Клонирование создает копию ВМ, поэтому ресурсы новой ВМ должны иметь уникальные имена. Для этого используются параметры nameReplacements и/или customization:

  • nameReplacements — позволяет заменить имена существующих ресурсов на новые, чтобы избежать конфликтов;
  • customization — задает префикс или суффикс для имен всех клонируемых ресурсов ВМ (дисков, IP-адресов и т. д.).

Пример переименования конкретных ресурсов:

nameReplacements:
  - from:
      kind: VirtualMachine
      name: <old-vm-name>
    to:
      name: <new-vm-name>
  - from:
      kind: VirtualDisk
      name: <old-disk-name>
    to:
      name: <new-disk-name>
# ...

В результате будет создана ВМ с именем <new-vm-name>, а указанные ресурсы будут переименованы согласно правилам замены.

Пример добавления префикса или суффикса ко всем ресурсам:

customization:
  namePrefix: <prefix>
  nameSuffix: <suffix>

В результате будет создана ВМ с именем <prefix><original-vm-name><suffix>, а все ресурсы (диски, IP-адреса и т. д.) получат префикс и суффикс.

Для операции клонирования возможно использовать один из трех режимов:

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

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

# Для клонирования из существующей ВМ.
d8 k get vmop <vmop-name> -o json | jq '.status.resources'
# Для клонирования из снимка ВМ.
d8 k get vmsop <vmsop-name> -o json | jq '.status.resources'

Создание клона существующей ВМ

Клонирование ВМ выполняется с использованием ресурса VirtualMachineOperation с типом операции Clone.

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

Рекомендуется задавать параметр .spec.runPolicy: AlwaysOff в конфигурации клонируемой ВМ, чтобы предотвратить автоматический запуск клона ВМ. Это связано с тем, что клон наследует поведение родительской ВМ.

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

Linux:

  • очистить machine-id с помощью команды sudo truncate -s 0 /etc/machine-id (для systemd) или удалить файл /var/lib/dbus/machine-id;
  • удалить SSH-ключи хоста: sudo rm -f /etc/ssh/ssh_host_*;
  • очистить конфигурации сетевых интерфейсов (если используются статические настройки);
  • очистить кеш Cloud-Init (если используется): sudo cloud-init clean.

Windows:

  • выполнить генерализацию с помощью sysprep с параметром /generalize или использовать инструменты для очистки уникальных идентификаторов (SID, hostname и так далее).

Для создания клона ВМ используйте следующий ресурс:

apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualMachineOperation
metadata:
  name: <vmop-name>
spec:
  type: Clone
  virtualMachineName: <name of the VM to be cloned>
  clone:
    mode: DryRun | Strict | BestEffort
    nameReplacements: []
    customization: {}

Параметры nameReplacements и customization настраиваются в блоке .spec.clone (см. общее описание выше).

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

В следующем примере показано клонирование ВМ с именем database и подключенного к ней диска database-root:

Пример с переименованием конкретных ресурсов:

apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualMachineOperation
metadata:
  name: clone-database
spec:
  type: Clone
  virtualMachineName: database
  clone:
    mode: Strict
    nameReplacements:
      - from:
          kind: VirtualMachine
          name: database
        to:
          name: database-clone
      - from:
          kind: VirtualDisk
          name: database-root
        to:
          name: database-clone-root

В результате будет создана ВМ с именем database-clone и диск с именем database-clone-root.

Пример с использованием префикса для всех ресурсов:

apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualMachineOperation
metadata:
  name: clone-database
spec:
  type: Clone
  virtualMachineName: database
  clone:
    mode: Strict
    customization:
      namePrefix: clone-
      nameSuffix: -prod

В результате будет создана ВМ с именем clone-database-prod и диск с именем clone-database-root-prod.

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

Клонирование ВМ из снимка выполняется с использованием ресурса VirtualMachineSnapshotOperation с типом операции CreateVirtualMachine.

Для создания клона ВМ из снимка используйте следующий ресурс:

apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualMachineSnapshotOperation
metadata:
  name: <vmsop-name>
spec:
  type: CreateVirtualMachine
  virtualMachineSnapshotName: <name of the VM snapshot from which to clone>
  createVirtualMachine:
    mode: DryRun | Strict | BestEffort
    nameReplacements: []
    customization: {}

Параметры nameReplacements и customization настраиваются в блоке .spec.createVirtualMachine (см. общее описание выше).

Чтобы посмотреть список ресурсов, сохранённых в снимке, используйте команду:

d8 k get vmsnapshot <snapshot-name> -o jsonpath='{.status.resources}' | jq

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

В следующем примере показано клонирование из снимка ВМ с именем database-snapshot, который содержит ВМ database и диск database-root:

Пример с переименованием конкретных ресурсов:

apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualMachineSnapshotOperation
metadata:
  name: clone-database-from-snapshot
spec:
  type: CreateVirtualMachine
  virtualMachineSnapshotName: database-snapshot
  createVirtualMachine:
    mode: Strict
    nameReplacements:
      - from:
          kind: VirtualMachine
          name: database
        to:
          name: database-clone
      - from:
          kind: VirtualDisk
          name: database-root
        to:
          name: database-clone-root

В результате будет создана ВМ с именем database-clone и диск с именем database-clone-root.

Пример с использованием префикса для всех ресурсов:

apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualMachineSnapshotOperation
metadata:
  name: clone-database-from-snapshot
spec:
  type: CreateVirtualMachine
  virtualMachineSnapshotName: database-snapshot
  createVirtualMachine:
    mode: Strict
    customization:
      namePrefix: clone-
      nameSuffix: -prod

В результате будет создана ВМ с именем clone-database-prod и диск с именем clone-database-root-prod.

Экспорт данных

Экспортировать диски и снимки дисков виртуальных машин можно с помощью утилиты d8 (версия 0.20.7 и выше). Для работы этой функции должен быть включен модуль storage-volume-data-manager.

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

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

d8 data export download -n <namespace> vd/<virtual-disk-name> -o file.img

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

d8 data export download -n <namespace> vd/<virtual-disk-name> -o file.img

Если вы выполняете экспорт данных не с узла кластера (например, с вашей локальной машины), используйте флаг --publish.

Чтобы импортировать скачанный диск обратно в кластер, загрузите его как образ или как диск.