Это руководство описывает перенос существующей виртуальной машины из VMware на Deckhouse Virtualization Platform (DVP).
Для переноса могут использоваться:
- дистрибутив виртуальной машины (файл
OVA, tar-архив с дисками в форматеvmdk, метаданными ВМ в форматеovfи контрольными суммами в форматеmf); - отдельные файлы дисков
VMDK.
Способы переноса
Прямой импорт VMDK
DVP поддерживает импорт дисков в формате vmdk.
Можно загрузить файл VMDK из OVA или экспорта vSphere в VirtualImage или ClusterVirtualImage, создать из образа диск и затем виртуальную машину.
Подробная инструкция приведена в разделе «Образы».
Платформа импортирует файл диска как есть и не адаптирует гостевую ОС к KVM. Для дисков из VMware это часто приводит к проблемам: ВМ не загружается, не видит диск или сеть (особенно в случае Windows). Прямой импорт подходит, если VMDK уже подготовлен для QEMU/KVM.
Рекомендуемый путь
Для типичных ВМ из VMware используйте утилиту virt-v2v: она конвертирует VMDK в qcow2 и адаптирует гостевую ОС к KVM (virtio-драйверы, загрузчик, замена VMware-устройств).
Подготовленный диск загружается напрямую в ресурс VirtualDisk с type: Upload.
Том создаётся в выбранном StorageClass, минуя DVCR.
Ниже приведена пошаговая инструкция по этому сценарию.
Этапы переноса
Перенос ВМ из VMware в DVP включает в себя следующие этапы:
- Установка необходимых инструментов.
- Конвертация диска.
- Загрузка диска в кластер в виде ресурса VirtualDisk.
- Создание виртуальной машины (ресурс VirtualMachine), которая загружается с этого диска.
Что необходимо для переноса
Перед началом переноса убедитесь, что у вас есть:
- доступ к кластеру DVP с установленной утилитой Deckhouse CLI (
d8) и правами на создание ресурсов виртуализации в нужном неймспейсе; - Linux-хост с
virt-v2vиlibguestfsи достаточным местом на диске под распаковкуOVA(или отдельныхVMDK) и результат конвертации; - файлы исходной ВМ (
OVAилиVMDK).
Подробнее о загрузке дисков в кластер описано в разделе «Диски».
Установка инструментов
На этом шаге вы подготавливаете рабочую станцию для конвертации. Это не обязательно должен быть узел кластера DVP: достаточно любого Linux-хоста с доступом в интернет или локальным репозиторием пакетов.
Перечень необходимых пакетов зависит от гостевой ОС в переносимой ВМ:
- для Linux достаточно
virt-v2vиlibguestfs; - для Windows дополнительно понадобится ISO
virtio-win, чтобы после миграции гостевая ОС корректно работала с виртуальными устройствами в KVM.
Установите инструменты:
- Рабочая станция с Ubuntu/Debian
- Рабочая станция с RHEL/AlmaLinux
Выполните следующую команду:
sudo apt update
sudo apt install -y virt-v2v libguestfs-tools
Если в переносимой ВМ используется ОС Windows:
-
Скачайте драйверы VirtIO из дистрибутива
virtio-win. -
Укажите путь к драйверам VirtIO через переменную окружения:
export VIRTIO_WIN=/path/to/virtio-win.iso
Без корректного virtio-win для гостевой системы Windows конвертация может завершиться ошибкой либо после запуска ВМ в DVP гостевая ОС не увидит диски или сеть.
Выполните команду:
sudo dnf install -y virt-v2v libguestfs-tools-c virtio-win
Если в переносимой ВМ используется ОС Windows, укажите путь к ISO через переменную окружения:
export VIRTIO_WIN=/path/to/virtio-win.iso
Затем перейдите к конвертации диска.
Конвертация диска
На этом шаге вы конвертируете данные VMware в один или несколько файлов формата qcow2, которые DVP сможет использовать как том виртуальной машины.
Если у вас уже есть готовый VMDK, можно сразу перейти к подразделу «Конвертация VMDK в qcow2 через virt-v2v».
Если используется дистрибутив виртуальной машины OVA, сначала распакуйте его.
Распаковка OVA
Файл OVA представляет собой tar-архив с манифестом, описанием ВМ в формате OVF и одним или несколькими VMDK.
Распаковка нужна, чтобы получить путь к файлу диска для утилиты virt-v2v.
Сохраните файл OVF: позже из него возьмёте CPU, память и тип загрузчика для ресурса VirtualMachine.
Распакуйте архив целиком, если хотите сверить контрольные суммы или посмотреть OVF:
tar -xvf machine.ova
Типичное содержимое:
machine.ova
├── machine.mf # контрольные суммы (SHA256)
├── machine.ovf # метаданные ВМ (CPU, RAM, диски, сети)
└── machine-disk1.vmdk # образ диска
Если архив большой, достаточно извлечь только нужный VMDK по имени из OVF:
tar -xvf machine.ova machine-disk1.vmdk
У ВМ с несколькими дисками в архиве будет несколько файлов *.vmdk. Каждый диск конвертируйте отдельно с помощью утилиты virt-v2v и при необходимости создайте в DVP несколько ресурсов VirtualDisk, затем перечислите их в VirtualMachine в нужном порядке загрузки.
Конвертация VMDK в qcow2 через virt-v2v
Утилита virt-v2v в режиме -i disk обрабатывает локальный VMDK и сохраняет результат в указанную директорию.
Для конвертации выполните команду:
- Для гостевой ОС Linux
- Для гостевой ОС Windows
virt-v2v -i disk ./machine-disk1.vmdk \
-o local -os ./out -of qcow2
Для конвертации VMDK для гостевой системы Windows укажите в команде путь к virtio-win.iso:
VIRTIO_WIN=/path/to/virtio-win.iso virt-v2v -i disk ./machine-disk1.vmdk \
-o local -os ./out -of qcow2
После конвертации в директории ./out появится файл вида ./out/machine.qcow2 (точное имя может совпадать с именем исходной ВМ из метаданных). Этот файл далее загружается в кластер.
Загрузка диска в кластер
Этот подраздел описывает, как передать подготовленный образ qcow2 в DVP через API Kubernetes.
На этом этапе файл становится постоянным томом в кластере: создайте ресурс VirtualDisk с type: Upload и передайте qcow2 по HTTP.
Диск попадёт в выбранный StorageClass, минуя DVCR.
Загрузка образа диска в кластер включает следующие шаги:
- Выбор StorageClass.
- Создание VirtualDisk для загрузки.
- Получение URL для загрузки.
- Загрузка образа.
- Проверка статуса загруженного образа.
Выбор StorageClass
StorageClass в Kubernetes определяет, где и как будет создан том.
По смыслу это ближе всего к datastore в VMware.
От класса зависят производительность, тип репликации и политика расширения томов.
Посмотрите список доступных классов в вашем кластере:
d8 k get storageclass
Пример вывода:
NAME PROVISIONER VOLUMEBINDINGMODE AGE
rv-thin-r1 (default) replicated.csi.storage.deckhouse.io Immediate 48d
rv-thin-r2 replicated.csi.storage.deckhouse.io Immediate 48d
Запомните имя класса, который подходит под ваши требования к хранилищу для дисков ВМ.
Создание VirtualDisk для загрузки
Создайте ресурс диска, указав StorageClass и размер тома.
Значение spec.persistentVolumeClaim.size должно быть не меньше фактического размера загружаемого qcow2.
При сомнениях заложите запас: если размера не хватило, пересоздайте ресурс с большим PVC.
d8 k apply -f - <<EOF
apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualDisk
metadata:
name: uploaded-disk
spec:
persistentVolumeClaim:
storageClassName: rv-thin-r1
size: 10Gi
dataSource:
type: Upload
EOF
После создания ресурс перейдёт в фазу WaitForUserUpload: том выделен, и можно начинать передачу файла.
Получение URL для загрузки
Платформа формирует два URL: внутренний (imageUploadURLs.inCluster) и внешний (imageUploadURLs.external). Используйте тот адрес, который доступен из вашей сети (изнутри кластера или с рабочей станции администратора).
Внутренний URL (используйте, если загрузка выполняется с узла кластера или из пода):
d8 k get vd uploaded-disk -o jsonpath="{.status.imageUploadURLs.inCluster}"
Внешний URL (используйте с рабочей станции администратора при настроенном доступе к DVP):
d8 k get vd uploaded-disk -o jsonpath="{.status.imageUploadURLs.external}"
Просмотреть оба значения одной командой (потребуется установленный jq):
d8 k get vd uploaded-disk -o jsonpath="{.status.imageUploadURLs}" | jq
Строка URL содержит секретный фрагмент пути. Не публикуйте её в открытых каналах.
Загрузка образа
Передайте файл qcow2 методом PUT на полученный на предыдущем шаге адрес. Ниже пример для внешнего URL. Подставьте свой адрес из статуса VirtualDisk и путь к файлу после конвертации.
curl https://virtualization.example.com/upload/<secret-url> \
--progress-bar -T ./out/machine.qcow2 | cat
Дождитесь завершения загрузки без ошибок HTTP. После этого контроллер обработает образ и переведёт диск в фазу Ready.
Проверка статуса
Убедитесь, что ресурс диска вышел в рабочее состояние и размер тома соответствует ожидаемому:
d8 k get vd uploaded-disk
Пример вывода:
NAMESPACE NAME PHASE CAPACITY AGE
default uploaded-disk Ready 10Gi 1m
Если фаза долго не меняется с WaitForUserUpload или ресурс перешёл в Failed, проверьте сообщения в d8 k describe vd uploaded-disk и события в соответствующем неймспейсе.
Когда диск в статусе Ready, можно создавать виртуальную машину.
Создание виртуальной машины
Последний шаг: опишите виртуальную машину, которая загрузится с перенесённого диска.
Укажите, сколько CPU и памяти выделить, к какой сети подключить и какой диск считать загрузочным.
Конфигурация VMware (OVF/VMX) напрямую не импортируется: перенесите параметры вручную, ориентируясь на OVF и таблицу соответствий ниже.
Соответствие понятий VMware и DVP
Для администраторов, знакомых с vSphere, ниже приведено соответствие привычных объектов VMware ресурсам Kubernetes и виртуализации DVP.
| VMware | DVP | Описание |
|---|---|---|
| Datastore | StorageClass | Хранилище для дисков |
| VMX (конфиг ВМ) | VirtualMachine.spec | Спецификация ВМ |
| Virtual Disk (VMDK) | VirtualDisk | Диск ВМ |
| ISO Image | VirtualImage (cdrom: true) |
ISO для установки или драйверов |
| Template | VirtualImage | Шаблон для создания дисков |
| Port Group / VLAN | VirtualMachine (networks) |
Сетевые настройки |
| Resource Pool | Project и квоты | Ограничения ресурсов на проект |
| Snapshot | VirtualDiskSnapshot / VirtualMachineSnapshot | Снимки диска и ВМ |
| Folder | Namespace | Неймспейс |
| Cluster / Resource Pool | Project | Группировка неймспейсов |
| ESXi Host | Node | Физический сервер |
| vCenter | Kubernetes API | Управление кластером |
Подробнее о подключении ВМ к сетям см. «Сети виртуальных машин».
Пример VirtualMachine
Ресурс VirtualMachine ссылается на уже загруженный диск через blockDeviceRefs. Порядок элементов в blockDeviceRefs задаёт порядок загрузки: первым должен идти диск с загрузчиком ОС.
Минимальный пример для Linux после миграции диска:
d8 k apply -f - <<EOF
apiVersion: virtualization.deckhouse.io/v1alpha2
kind: VirtualMachine
metadata:
name: my-vm
spec:
virtualMachineClassName: generic
osType: Generic
cpu:
cores: 2
memory:
size: 4Gi
networks:
- type: Main
blockDeviceRefs:
- kind: VirtualDisk
name: uploaded-disk
EOF
Для Windows укажите osType: Windows.
Если исходная ВМ в VMware загружалась через UEFI, добавьте bootloader: EFI (см. таблицу параметров ниже).
Если в кластере настроены дополнительные сети и модуль SDN, к основной сети можно добавить интерфейсы:
networks:
- type: Main
- type: Network
name: user-net
Дополнительные возможности (cloud-init, несколько дисков, классы виртуальных машин для production-окружения) описаны в разделе «Виртуальные машины».
Основные параметры спецификации
Ниже перечислены поля, которые чаще всего нужно сверить после переноса с VMware.
Значения CPU, памяти и типа загрузчика обычно можно взять из распакованного OVF.
| Параметр | Описание |
|---|---|
virtualMachineClassName |
Класс ВМ, например, generic, serverful, high-performance |
osType |
Тип ОС: Generic (Linux и прочее) или Windows |
bootloader |
Тип загрузчика: BIOS, EFI или EFIWithSecureBoot; для ВМ с UEFI в VMware укажите EFI |
cpu.cores |
Количество виртуальных CPU |
memory.size |
Объём оперативной памяти |
blockDeviceRefs |
Диски и образы; порядок в списке задаёт приоритет загрузки |
provisioning.type: UserData |
Передача cloud-init для первичной настройки гостевой ОС |
Проверка статуса ВМ
После применения манифеста дождитесь, пока ВМ запустится и получит адрес (если настроена основная сеть с выдачей IP из virtualMachineCIDRs):
d8 k get vm my-vm
Пример вывода:
NAME PHASE NODE IPADDRESS AGE
my-vm Running virtlab-pt-2 10.66.10.12 2m
При фазе Pending или ошибках запуска используйте d8 k describe vm my-vm, последовательную консоль d8 v console my-vm (см. раздел «Подключение к ВМ» ниже) и журналы компонентов виртуализации в кластере.
Подключение к ВМ
Выберите способ доступа в зависимости от того, настроена ли гостевая ОС на приём SSH, нужен ли графический вход или достаточно последовательной консоли для диагностики загрузки.
| Способ | Назначение | Команда |
|---|---|---|
| Последовательная консоль | Нужен вывод загрузчика и ядра | d8 v console my-vm |
| VNC | Графическая консоль без SSH | d8 v vnc my-vm |
| SSH | Удалённый вход по сети к гостю | d8 v ssh cloud@my-vm --local-ssh |
Имя пользователя для SSH задаётся в гостевой системе; в примерах из документации DVP после cloud-init часто создаётся пользователь cloud.