Exporter une instance OpenStack vers VMware vSphere
Les migrations inverses existent : un workload doit rejoindre un parc vSphere après une fusion, un partenaire n'accepte que des images VMDK, ou une zone d'atterrissage hybride fait tourner les deux hyperviseurs. Deux voies couvrent la plupart des cas : un snapshot Glance converti en VMDK stream-optimized pour les VM isolées, et une conversion directe Ceph RBD vers VMDK pour les disques de plusieurs téraoctets. Commandes illustratives, à adapter à vos versions et à votre réseau.
1. Préparer l'invité avant l'export
L'invité quitte un monde KVM/VirtIO pour du matériel paravirtuel VMware. Avant le dernier arrêt, installez VMware Tools ou open-vm-tools, vérifiez que l'initramfs (Linux) ou les pilotes critiques au boot (Windows, LSI Logic SAS ou PVSCSI) sont présents, retirez le qemu-guest-agent, et notez les adresses IP, les MAC et l'ordre des disques. Un invité exporté sans ces pilotes démarre sur un écran noir sous ESXi.
# Record what you will need to recreate the VM on vSphere
openstack server show vm-production-01 -c flavor -c addresses -c volumes_attached -c image
openstack server volume list vm-production-01
openstack port list --server vm-production-01 -c "MAC Address" -c "Fixed IP Addresses"
# Gracefully stop the source OpenStack VM
openstack server stop vm-production-01
2. Voie A : snapshot Glance vers VMDK stream-optimized
Chemin simple pour une VM isolée sans accès direct au backend Ceph. L'instance est snapshotée dans Glance, téléchargée, puis convertie avec qemu-img. Le sous-format VMDK streamOptimized est conçu pour le transfert et convient aux imports de type OVF/OVA ; validez le workflow exact avec la version vSphere cible.
2.1 Créer le snapshot et télécharger l'image
# Create an image snapshot from the stopped instance (Nova + Glance)
openstack server image create --name snap-vm-prod-01 --wait vm-production-01
# Download the image (format is whatever Glance stores: raw with Ceph, often qcow2 elsewhere)
openstack image show snap-vm-prod-01 -c disk_format -c size
openstack image save --file vm-prod-01.img snap-vm-prod-01
2.2 Convertir en VMDK stream-optimized
# -f must match the downloaded format (raw or qcow2); read it from qemu-img JSON output
INPUT_FORMAT=$(qemu-img info --output=json vm-prod-01.img | jq -r '.format')
qemu-img convert -p -f "$INPUT_FORMAT" -O vmdk -o subformat=streamOptimized \
vm-prod-01.img vm-prod-01-esxi.vmdk
Les instances démarrées depuis un volume n'ont pas d'image à snapshoter : utilisez openstack volume snapshot create, clonez le snapshot en volume, puis openstack image create --volume pour obtenir une image Glance, exactement comme dans le guide de migration Cinder.
3. Voie B : Ceph RBD direct vers VMDK
Approche haut volume pour des volumes Cinder de plusieurs téraoctets. qemu-img lit l'image RBD via son protocole natif rbd: et écrit le VMDK en une passe, sans fichier raw intermédiaire. Il faut un hôte disposant du keyring client Ceph et d'un accès réseau aux OSD ; qemu-img ne peut pas lire une image raw depuis un pipe, donc rbd export | qemu-img n'est pas une option.
# Identify the Cinder volume and its RBD image (volume must be detached: instance stopped and volume available)
openstack volume show <VOLUME_ID> -c status -c size
rbd -p cinder-volumes info volume-<VOLUME_ID>
# Convert the RBD image straight to a stream-optimized VMDK, no intermediate file
qemu-img convert -p -f raw -O vmdk -o subformat=streamOptimized \
rbd:cinder-volumes/volume-<VOLUME_ID>:id=cinder:conf=/etc/ceph/ceph.conf \
vm-heavy-disk.vmdk
# Alternative when the target datastore is mounted (NFS) or reachable over SSH: write the VMDK there directly
qemu-img convert -p -f raw -O vmdk -o subformat=streamOptimized \
rbd:cinder-volumes/volume-<VOLUME_ID> /mnt/datastore1/upload/vm-heavy-disk.vmdk
4. Enregistrer la VM dans vCenter
govc import.vmdk téléverse le disque dans le datastore ; il ne crée pas de machine virtuelle. Créez la VM éteinte sur le disque importé, puis ajustez le réseau, le firmware et le type de contrôleur avant le premier démarrage. Sur ESXi lui-même, vmkfstools convertit un disque téléversé au format natif thin-provisioned.
# Import the VMDK into the vSphere datastore with govc
export GOVC_URL='https://<VCENTER_HOST>' GOVC_USERNAME='<VCENTER_USER>' GOVC_INSECURE=1
govc import.vmdk -pool=Cluster01/Resources -ds=datastore1 vm-prod-01-esxi.vmdk vm-prod-01/
# Create the VM on the imported disk (powered off, network and firmware to adjust)
govc vm.create -pool=Cluster01/Resources -ds=datastore1 -net="VM Network" \
-c 4 -m 8192 -g ubuntu64Guest -firmware efi \
-disk=vm-prod-01/vm-prod-01-esxi.vmdk -on=false vm-prod-01
# Re-apply the original MAC address when licences or firewall rules depend on it
govc vm.network.change -vm vm-prod-01 -net "VM Network" -net.address <OLD_MAC> ethernet-0
govc vm.power -on vm-prod-01
# ESXi shell alternative: convert an uploaded disk to thin provisioning in place
vmkfstools -i /vmfs/volumes/datastore1/upload/vm-heavy-disk.vmdk -d thin /vmfs/volumes/datastore1/vm-heavy/disk-final.vmdk
5. Points de vigilance
- ■Pilotes de boot : les invités Linux ont besoin du module de contrôleur SCSI (mptsas, vmw_pvscsi) dans l'initramfs ; les invités Windows ont besoin du pilote de stockage correspondant avant que le disque ne quitte OpenStack. Testez d'abord sur un clone.
- ■Firmware : une instance démarrée avec hw_firmware_type=uefi doit être créée avec -firmware efi dans vSphere ; un invité BIOS créé en EFI ne démarre pas non plus.
- ■cloud-init : désactivez-le ou reconfigurez-le avant l'export, sinon l'invité peut réinitialiser sa configuration réseau ou son nom d'hôte au premier démarrage sous vSphere.
- ■Cohérence : ne snapshotez ou convertissez qu'une instance arrêtée (ou un volume détaché). Un export RBD à chaud produit au mieux un disque crash-consistent.
- ■Débit : dimensionnez la fenêtre sur un run qemu-img mesuré sur un volume représentatif ; la vitesse de téléversement vers le datastore est généralement le goulot, pas Ceph.
- ■Retour arrière : gardez l'instance OpenStack arrêtée mais intacte jusqu'à la signature de la recette sous vSphere ; openstack server start est le retour arrière.