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

Клонируемой ВМ будет назначен новый 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.

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

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

Клонирование ВМ из снимка выполняется с использованием ресурса 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.

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