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

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

Снимки могут быть консистентными и неконсистентными. За это отвечает параметр 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-адреса для дополнительных сетевых интерфейсов (если они есть), поэтому после клонирования потребуется перенастроить сетевые параметры гостевой ОС.

Лейблы не копируются с исходной ВМ на клон. Это предотвращает маршрутизацию трафика Service (Service выбирают ВМ по меткам) на клон. Если клон должен входить в Service, добавьте нужные лейблы после клонирования. Например:

d8 k label vm <vm-name> label-name=label-value

Клонирование создает копию ВМ, поэтому ресурсы новой ВМ должны иметь уникальные имена. Для этого используются параметры 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.

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

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