Skip to main content

Virtual machines

Run existing virtual-machine workloads beside Kubernetes applications.

Virtual machines use the same projects, networks, quotas, and dashboards as containers. Compatible line-of-business systems, virtual appliances, and Windows servers can move onto the platform without a separate virtualization control plane.

Guest support

  • Linux: the prepared-image catalog identifies the validated distributions and versions (Ubuntu, Debian and other cloud-image distributions).
  • Windows: provisioned from prepared images containing the required VirtIO drivers and QEMU guest agent, via the platform's Windows image pipeline — see the published Windows documentation.
  • Bring your own image: import qcow2/raw disk images from HTTP or S3 sources into a project; guest and driver compatibility validation is yours.

Provisioning: prepared images and instant clones

Each project carries a catalog of prepared OS images published as storage snapshots. Creating a VM clones the snapshot — the root disk is created without a per-VM image download or data copy; completion depends on your hardware, storage and current load. VMs are declared as manifests (or created in the console):

  • CPU cores, memory and disk size per VM; resizable as the workload grows (disk grows only).
  • Cloud-init for first-boot configuration: packages, users, scripts.
  • SSH-key injection from the project's managed keypair — no password distribution.
  • Interactive console in the web UI for installation, rescue and break-glass access.
Create VM form showing Project subnet, root disk size, local and shared RBD storage profiles, prepared-image provisioning and live-migration eligibility
VM creation makes storage durability and mobility trade-offs explicit before provisioning, including prepared-image cloning and the shared-storage requirement for live migration.
Kube-DC virtual machine resource flowA user creates a VirtualMachine through the console, kubectl, or virtctl. KubeVirt controllers reconcile the VirtualMachine and VirtualMachineInstance, which runs in a virt-launcher Pod using QEMU and the guest operating system. The VirtualMachine also references a CDI DataVolume backed by a PersistentVolumeClaim and the Project default network connected to the Project VPC.Userconsole · kubectlvirtctlKubeVirt controllersruntime reconcilerCDIdisk provisionerVirtualMachineProject VM specificationRUNTIMESTORAGENETWORKVirtualMachineInstanceKubeVirt runtimevirt-launcher PodVM process PodGuest runtimeQEMU + guest OSDataVolumeCDI sourcePersistentVolumeClaimpersistent diskProject default networkNADProject VPCisolated routing
KubeVirt reconciles the VM runtime, CDI provisions the persistent disk, and Kube-OVN attaches the VM to its Project VPC; all branches originate from the Project VirtualMachine resource.

VM profiles: standard and migratable

Two documented profiles, selected at creation:

Standard profileMigratable profile
Root diskNode-local or replicated blockShared block storage (read-write-many)
Host maintenanceVM restarts on another hostEligible for live migration during host drains
Typical useStateless or restart-tolerant workloadsLong-lived servers, stateful systems in VMs

The Migratable profile pins a common CPU model across the migration pool. A VM is eligible for live migration when its disks use the configured shared block tier and a CPU-compatible destination host has sufficient capacity; failed or ineligible migrations may require a restart.

Lifecycle and operations

  • Start, stop, restart and delete from the console, kubectl or the CLI.
  • Snapshots of running VMs — online snapshots via the standard Kubernetes snapshot API; install the QEMU guest agent for filesystem-consistent captures.
  • Eviction behavior per VM: live-migrate or restart on drain.
  • VM manifests are declarative Kubernetes resources — keep them in Git like the rest of your infrastructure.
Kube-DC virtual machine Guest OS panel with a Linux console preview and actions to launch the remote console or an SSH terminal
The VM detail view provides browser-based console and SSH entry points for installation, rescue and break-glass access.

Networking

VMs attach to the project's VPC like any pod:

  • Private addresses in the project subnet; reachable from the project's other workloads.
  • Floating IPs give a VM its own external address — inbound and outbound — without a load balancer.
  • LoadBalancer services and HTTPS routes can front VM-hosted services exactly as they front pods.
  • With VLAN attachment, VMs talk layer-2 to existing datacenter equipment — the consolidation path for systems that expect to sit on a specific network segment.

Storage

  • Root and data disks as block volumes; disk expansion online.
  • Additional volumes attach and detach as Kubernetes resources.
  • Volume snapshots and clones for copies, templates and test environments.

GPU guests

A VM can be given a whole physical GPU (dedicated passthrough) where the platform team has enabled and qualified GPU support — a stronger boundary than software GPU sharing, at the cost of live migration. See the GPU services datasheet for products, entitlements and the qualification model.

Responsibilities

ConcernYour platform teamTenant
Virtualization layer, hosts, live-migration machinery
Prepared image catalog✅ publishes✅ may bring own images
VM sizing, lifecycle, in-guest configuration
Guest OS patching and hardening
VM data protectionSnapshot APIs provided✅ snapshots + in-guest/enterprise backup
Network exposureIPs and routes provided✅ configures

What to know before migrating

Disk import from other virtualization platforms is supported (qcow2/raw); migration itself is a planned operation — inventory, guest preparation (VirtIO drivers for Windows), disk conversion, cutover — not an automatic "lift". VMs do not need to be refactored into containers: the point of this function is that they run as VMs, on the same platform your containerized services use.