Skip to content

Migrate from Azure Virtual Machines to Quake AI Compute

Migration · Updated Jun 2026

Coming from another cloud?

▸Azure·Virtual Machines, Managed Disks, VM Images

Virtual Machineshigh

  • Uses Azure Resource Manager (ARM) REST API at /providers/Microsoft.Compute/virtualMachines instead of OpenStack Nova API at /v2.1/servers.
  • Tightly integrated with Azure services like Azure Active Directory for authentication, unlike OpenStack's Keystone.
  • VM creation requires specifying size from predefined series with hardware-specific features (e.g., AMD/Intel/ARM), not custom flavor configs.
  • Billed per second with complex pricing tiers based on series/reservation options, vs OpenStack's typically hourly or usage-based.
Azure docs ↗

Azure Managed Diskshigh

  • Azure Managed Disks are fully managed with automatic redundancy (3 replicas, 99.999% SLA); Cinder durability depends on backend.
  • Predefined disk types (Ultra Disk, Premium SSD v2, Premium SSD, Standard SSD, Standard HDD) with fixed performance tiers; Cinder uses volume types with configurable QoS.
  • Disks billed on provisioned size regardless of use; Cinder billing typically on provisioned size too but varies by provider.
Azure docs ↗

Migrate from Azure virtual machines to Quake AI compute

This guide covers migrating compute workloads from Azure VMs to Quake AI (OpenStack Nova). Azure supports VHD disk export via SAS URL, which can be converted to QCOW2 and uploaded to Glance. For most workloads, rebuild and rsync is still faster and simpler. Image export is practical for custom Azure images that are difficult to rebuild.

Service mapping#

Azure to Quake AI

Azure serviceQuake AI equivalentKey difference
Copy Managed DiskClonesAzure cloning via 'az disk create --source' from disk ID or snapshot, supports cross-subscription/region with grants; Cinder uses 'cinder... see details
VM sizesFlavorsPredefined hardware-optimized series (e.g., D-family general purpose) with complex naming (e.g., Standard_D4as_v5), not user-defined... see details
Compute Gallery image definitions and versionsImagesOrganized in galleries with image definitions and versioned images (Microsoft.Compute/galleries/images/versions), more structured than flat... see details
Virtual MachinesInstancesUses Azure Resource Manager (ARM) REST API at /providers/Microsoft.Compute/virtualMachines instead of OpenStack Nova API at /v2.1/servers.... see details
SSH public keysKey PairsManaged as ARM resources (Microsoft.Compute/sshPublicKeys), reusable across VMs, vs OpenStack's keypairs injected only at boot. API... see details
Availability setsServer GroupsUses fault/update domains (max 3/20) for HA, fixed at creation, vs flexible OpenStack server group policies (affinity/anti-affinity). ARM... see details
Compute Gallery Image (Generalized or Specialized)SnapshotsAzure requires choosing between generalized (sysprep'd, removes machine identity, destroys the source VM's bootability) and specialized... see details
SnapshotsSnapshotsSnapshots of managed disks (Microsoft.Compute/snapshots), billed on used size, separate from volumes unlike Cinder volume snapshots... see details

Prerequisites#

  • A Quake AI account with application credentials
  • The OpenStack CLI installed and configured
  • SSH access to your Azure VMs
  • An SSH key pair imported to Quake AI (openstack keypair create --public-key)
  • For image export: az CLI installed, azcopy for large downloads, and qemu-img for VHD→QCOW2 conversion

Image portability#

Azure managed disks can be exported as VHD files via a time-limited SAS URL. The VM must be stopped and deallocated for a consistent disk state.

bash
# Stop and deallocate the VM (a single command does both)
az vm deallocate --resource-group MY_RESOURCE_GROUP --name MY_VM

# Generate a SAS URL for the OS disk (36000 seconds = 10 hours)
az disk grant-access --resource-group MY_RESOURCE_GROUP \
  --name MY_OS_DISK \
  --duration-in-seconds 36000 --access-level Read

# Download using AzCopy (faster than browser download)
azcopy copy "GENERATED_SAS_URL" ./my-vm.vhd

# Convert VHD to QCOW2
qemu-img convert -f vpc -O qcow2 my-vm.vhd my-vm.qcow2

# Upload to Glance
openstack image create "my-azure-image" \
  --disk-format qcow2 --container-format bare \
  --file my-vm.qcow2

When to use image export: For custom Azure images with significant baked-in software or proprietary configuration. The stop-export-convert-upload pipeline is reliable but slow. For standard OS images, use Quake AI public images and rebuild.

Flavor mapping#

Azure VM series map to Quake AI flavor families by their RAM-to-vCPU ratio. D-series (general purpose, 4:1) maps to m2a, E-series (memory optimized, 8:1) maps to r2a, and F-series (compute optimized, 2:1) maps to c2a. B-series (burstable) maps to s1a for small workloads like Standard_B2s, but larger B-series VMs with a 4:1 ratio like Standard_B4ms map to m2a. Match by ratio: a 4:1 B-series VM targets m2a rather than s1a.

Azure VM SizevCPUsRAM (GiB)Quake AI FlavorvCPUsRAM (GiB)Notes
Standard_B2s24s1a.medium24Burstable → shared
Standard_B4ms416m2a.xlarge416Exact ratio match
Standard_D2s_v628m2a.large28Exact ratio match
Standard_D4s_v6416m2a.xlarge416Exact ratio match
Standard_D8s_v6832m2a.2xlarge832Exact ratio match
Standard_D16s_v61664m2a.4xlarge1664Exact ratio match
Standard_D32s_v632128m2a.8xlarge32128Exact ratio match
Standard_D64s_v664256m2a.16xlarge64256Exact ratio match
Standard_E2s_v6216r2a.large216Exact ratio match
Standard_E8s_v6864r2a.2xlarge864Exact ratio match
Standard_E16s_v616128r2a.4xlarge16128Exact ratio match
Standard_F2s_v224c2a.large24Exact ratio match
Standard_F8s_v2816c2a.2xlarge816Exact ratio match

Azure's naming convention is less direct than other providers. The family ratios follow common conventions and map to Quake AI flavor families.

Migration approach#

If your Azure VMs run containers (or you use AKS), migrate container images and redeploy.

  1. Push images from Azure Container Registry to a portable registry:
bash
docker pull MY_REGISTRY.azurecr.io/MY_APP:latest
docker tag MY_REGISTRY.azurecr.io/MY_APP:latest \
  registry.example.com/MY_APP:latest
docker push registry.example.com/MY_APP:latest
  1. Provision a Nova instance on Quake AI:
bash
openstack server create \
  --image "Ubuntu-22.04" \
  --flavor m2a.xlarge \
  --network MY_NETWORK \
  --key-name MY_KEY \
  --security-group MY_SECURITY_GROUP \
  MY_INSTANCE_NAME
  1. Install Docker and deploy:
bash
ssh ubuntu@FLOATING_IP
sudo apt update && sudo apt install -y docker.io
sudo docker pull registry.example.com/MY_APP:latest
sudo docker run -d -p 80:8080 registry.example.com/MY_APP:latest

Option 2: Rebuild and rsync (non-containerized)#

  1. Provision a Nova instance with the same base OS:
bash
openstack server create \
  --image "Ubuntu-22.04" \
  --flavor m2a.xlarge \
  --network MY_NETWORK \
  --key-name MY_KEY \
  --security-group MY_SECURITY_GROUP \
  MY_INSTANCE_NAME
  1. Assign a floating IP:
bash
openstack floating ip create PublicStatic
openstack server add floating ip MY_INSTANCE_NAME FLOATING_IP
  1. Install your application stack. Reuse cloud-init configs, ARM templates as reference, or configuration management playbooks.

  2. Transfer application data:

bash
rsync -avz --progress -e "ssh -i ~/.ssh/MY_KEY" \
  MY_USER@AZURE_PUBLIC_IP:/path/to/app/data \
  ubuntu@FLOATING_IP:/path/to/app/data
  1. Migrate databases:
bash
pg_dump -h AZURE_PUBLIC_IP -U MY_USER MY_DATABASE | \
  psql -h FLOATING_IP -U MY_USER MY_DATABASE

Key pair and security setup#

Import your SSH key#

bash
openstack keypair create --public-key ~/.ssh/id_ed25519.pub my-key

Translate NSGs to security groups#

Azure NSGs support both allow and deny rules with priority ordering, and can bind to subnets or individual NICs. Neutron security groups are allow-only, additive, and bind per port (per instance). If your security posture relies on deny rules, subnet-level NSGs, or priority ordering, rethink the logic for a per-instance additive model.

bash
openstack security group create web-tier
openstack security group rule create web-tier \
  --protocol tcp --dst-port 22 --remote-ip 0.0.0.0/0
openstack security group rule create web-tier \
  --protocol tcp --dst-port 80 --remote-ip 0.0.0.0/0
openstack security group rule create web-tier \
  --protocol tcp --dst-port 443 --remote-ip 0.0.0.0/0

Validation checklist#

After migrating each workload, verify:

  • Application responds correctly on the Quake AI instance
  • All expected ports are accessible through the security group
  • Data integrity: compare file checksums or row counts between source and destination
  • Database connectivity from the application to any migrated databases
  • DNS records updated to point to the new Quake AI floating IP
  • Monitoring in place (self-managed Prometheus + Grafana to replace Azure Monitor)
  • cloud-init or configuration management runs cleanly on the new instance
  • SSL/TLS certificates installed and renewed

Provider-specific gotchas#

TopicDetail
Archive tier rehydrationStandard priority rehydration takes up to 15 hours; high priority can complete in under one hour at a higher cost. An early-deletion fee applies if objects leave the Archive tier before 180 days. Plan for this if migrating Azure Blob Storage alongside compute.
Windows Server licensingBYOL from Software Assurance is required. Cloud-only Windows licenses are provider-locked. Microsoft licensing terms restrict some cloud-to-cloud VM transfers.
VHD download timeLarge managed disks (1 TB+) can take 4+ hours to download even with AzCopy. Schedule accordingly.
NSG deny rulesAzure NSGs support allow+deny with priority. Rethink deny-based security posture for Neutron's allow-only model.
Entra ID (Azure AD)No Quake AI equivalent. Application authentication must switch to OpenStack application credentials or an external IdP.
Managed IdentitiesAzure VMs can use system-assigned or user-assigned Managed Identities to authenticate to Azure services without stored credentials. No Quake AI equivalent. Switch to OpenStack application credentials or external secrets management.
AKS workloadsAKS → self-managed K8s is the most complex migration. See the Kubernetes migration guide.

See also#

Usage Guidelines

The sample code, software libraries, command line tools, proofs of concept, templates, and other related technology on this page (including any of the foregoing that is provided by Quake AI personnel) is provided to you as Quake AI Content under the Quake AI Customer Agreement, or the relevant written agreement between you and Quake AI (whichever applies). Do not use this Quake AI Content in your production accounts, or on production or other critical data. You are responsible for testing, securing, and optimizing the Quake AI Content (such as sample code) as appropriate for production grade use based on your specific quality control practices and standards. Deploying Quake AI Content may incur Quake AI charges for creating or using Quake AI chargeable resources, such as running Compute instances or storing data in Object Storage. Your use is also subject to the Acceptable Use Policy.

Comparisons to third-party providers in this material reflect publicly documented behavior as of the validation date below. Pricing, quotas, service limits, and feature availability change frequently on every cloud. Verify provider-specific claims against the provider's own current documentation before relying on them for a procurement, architecture, or migration decision.

For the full policy, see Usage Guidelines.

Last validated: 22.06.2026

Quick answers

Was this page helpful?