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