Skip to main content

Deploy Linux images (containerdisk + CDI golden)

Zorvia supports two ways to boot major Linux distros from upstream quay.io/containerdisks:

PathWhen to useWhat happens
ContainerDiskDemo / quick createVM references quay.io/... directly; the node pulls at start. No PVC import.
CDI golden (zorvia image-bundle)Shared golden library, rollback, many VMsImport once into a versioned PVC + stable DataSource; VMs clone from that.

Create VM (GET /api/images) lists ready containerdisks. Golden CDI YAML is generated by zorvia image-bundle (http or docker:// registry sources).

The web console's "Download an OS image" flow in Create VM does the same import without a manual kubectl apply: POST /api/images/cloud/download resolves a catalog entry to an HTTP or registry source, builds the same DataVolume/DataSource bundle as image-bundle, and applies both directly to the cluster. The response's output_path is a datavolume:<name> reference — pass it straight back as the Create VM disk image once the job reaches Completed (poll GET /api/images/downloads).

Ready quay.io containerdisks (major Linux)​

DistroImage
Ubuntuquay.io/containerdisks/ubuntu:24.04, :22.04, :20.04, :18.04
Fedoraquay.io/containerdisks/fedora:41, :40, :39
CentOS Streamquay.io/containerdisks/centos-stream:9, :8
Debianquay.io/containerdisks/debian:12, :11
AlmaLinuxquay.io/containerdisks/almalinux:9, :8
Rocky Linuxquay.io/containerdisks/rockylinux:9, :8
Alpinequay.io/containerdisks/alpine:3.19
VirtIO (Windows)quay.io/containerdisks/virtio-win (CD-ROM helper, not a root OS)

These match the OS templates in src/templates/mod.rs and the SPA image catalog.

Instant VM (containerdisk)​

Pick an image in Create VM, or pass the quay path with format: containerdisk. No CDI import is required; KubeVirt pulls the OCI disk at VM start.

CDI golden image bundles​

zorvia image-bundle generates a versioned CDI DataVolume plus a stable DataSource alias. VMs can consume the stable name while promotion moves the alias to a new immutable PVC/DataVolume revision.

HTTP / HTTPS qcow2 source​

zorvia --namespace vm-images image-bundle ubuntu-golden \
--version 24.04-r2 \
--source https://images.example/ubuntu.qcow2 \
--source-type http \
--size 40Gi \
--storage-class fast \
--checksum sha256:abc123 \
--output ubuntu-golden.yaml

Registry sources (same quay containerdisks)​

Requires CDI and a working StorageClass. Namespace once, then generate + apply:

kubectl create ns vm-images

zorvia --namespace vm-images image-bundle ubuntu-golden \
--version 24.04-r1 \
--source docker://quay.io/containerdisks/ubuntu:24.04 \
--source-type registry \
--size 40Gi \
--storage-class fast \
--output ubuntu-golden.yaml

zorvia --namespace vm-images image-bundle fedora-golden \
--version 41-r1 \
--source docker://quay.io/containerdisks/fedora:41 \
--source-type registry \
--size 40Gi \
--storage-class fast \
--output fedora-golden.yaml

zorvia --namespace vm-images image-bundle debian-golden \
--version 12-r1 \
--source docker://quay.io/containerdisks/debian:12 \
--source-type registry \
--size 40Gi \
--storage-class fast \
--output debian-golden.yaml

zorvia --namespace vm-images image-bundle almalinux-golden \
--version 9-r1 \
--source docker://quay.io/containerdisks/almalinux:9 \
--source-type registry \
--size 40Gi \
--storage-class fast \
--output almalinux-golden.yaml

zorvia --namespace vm-images image-bundle rockylinux-golden \
--version 9-r1 \
--source docker://quay.io/containerdisks/rockylinux:9 \
--source-type registry \
--size 40Gi \
--storage-class fast \
--output rockylinux-golden.yaml

zorvia --namespace vm-images image-bundle centos-stream-golden \
--version 9-r1 \
--source docker://quay.io/containerdisks/centos-stream:9 \
--source-type registry \
--size 40Gi \
--storage-class fast \
--output centos-stream-golden.yaml

zorvia --namespace vm-images image-bundle alpine-golden \
--version 3.19-r1 \
--source docker://quay.io/containerdisks/alpine:3.19 \
--source-type registry \
--size 10Gi \
--storage-class fast \
--output alpine-golden.yaml

kubectl apply -f ubuntu-golden.yaml
# wait for DataVolume Succeeded, validate, then rely on the stable DataSource

To generate the full major-Linux library in one pass (set your StorageClass):

STORAGE_CLASS=fast ./fixtures/golden-images/generate-bundles.sh
kubectl apply -f fixtures/golden-images/out/

Promotion flow​

  1. Apply the versioned DataVolume and wait until CDI import reaches Succeeded.
  2. Validate the imported PVC with a disposable VM.
  3. Apply the stable DataSource alias only after validation succeeds.
  4. Keep the previous versioned PVC until rollback retention expires.