Снимки позволяют зафиксировать текущее состояние ресурса для последующего восстановления или клонирования. Снимок диска сохраняет только данные выбранного диска, а снимок виртуальной машины (ВМ) включает в себя параметры ВМ и состояние всех её дисков.
Консистентные снимки
Снимки могут быть консистентными и неконсистентными. За это отвечает параметр 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 означает, что снимок консистентен. Оно определяется автоматически по условиям создания снимка и вручную не меняется.
- Перейдите на вкладку «Проекты» и выберите нужный проект.
- Перейдите в раздел «Виртуализация» → «Снимки дисков».
- Нажмите кнопку «Создать».
- В открывшемся окне «Создать ресурс» в поле «Имя» введите имя для снимка.
- На вкладке «Конфигурация» в поле «Имя виртуального диска» выберите диск, с которого будет создан снимок.
- Включите переключатель «Требуемая консистентность».
- Нажмите кнопку «Применить».
- Статус снимка отображается в колонке «Статус».
Восстановление дисков из снимков
Из снимка создаётся новый диск, а исходный остаётся нетронутым.
- В командной строке
- В веб-интерфейсе
Для того чтобы восстановить диск из ранее созданного снимка диска, необходимо в качестве 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 оригинального диска.
- Нажмите кнопку «Создать».
- Статус диска отображается на его странице.
Создание снимков ВМ
Снимок виртуальной машины — это сохранённое состояние виртуальной машины в определённый момент времени. Для создания снимков виртуальных машин используется ресурс 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
- Перейдите на вкладку «Проекты» и выберите нужный проект.
- Перейдите в раздел «Виртуализация» → «Виртуальные машины».
- Из списка выберите нужную ВМ и нажмите на её имя.
- Перейдите на вкладку «Снимки».
- Нажмите кнопку «Добавить».
- В открывшейся форме в поле «Имя снимка» введите
linux-vm-snapshot. - Включите переключатель «Гарантия целостности».
- Нажмите кнопку «Создать».
- Статус снимка отображается на его странице.
- Созданные снимки перечислены на вкладке «Снимки» виртуальной машины с колонками «Имя», «Статус», «Дата создания» и «Консистентный».
Восстановление ВМ
Восстановление возвращает машину и её диски к состоянию, сохранённому в снимке. Запускает его ресурс 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'
- Перейдите на вкладку «Проекты» и выберите нужный проект.
- Перейдите в раздел «Виртуализация» → «Виртуальные машины».
- Из списка выберите нужную виртуальную машину и нажмите кнопку с многоточием.
- В открывшемся меню выберите «Восстановить».
- В открывшемся окне «Восстановление машины» в поле «Имя снимка виртуальной машины» выберите снимок.
- В поле «Режим восстановления» выберите
StrictилиBestEffort. - Нажмите кнопку «Восстановить».