$ cat > Dockerfile << EOF
FROM registry.access.redhat.com/ubi8/ubi:latest AS builder
ADD --chown=107:107 <vm_image>.qcow2 /disk/ (1)
RUN chmod 0440 /disk/*
FROM scratch
COPY --from=builder /disk/* /disk/
EOF
You can create virtual machines (VMs) by using container disks built from operating system images.
You can enable auto updates for your container disks. See Managing automatic boot source updates for details.
If the container disks are large, the I/O traffic might increase and cause worker nodes to be unavailable. You can perform the following tasks to resolve this issue: |
You create a VM from a container disk by performing the following steps:
Build an operating system image into a container disk and upload it to your container registry.
If your container registry does not have TLS, configure your environment to disable TLS for your registry.
Create a VM with the container disk as the disk source by using the web console or the command line.
You must install the QEMU guest agent on VMs created from operating system images that are not provided by Red Hat. |
You can build a virtual machine (VM) image into a container disk and upload it to a registry.
The size of a container disk is limited by the maximum layer size of the registry where the container disk is hosted.
For Red Hat Quay, you can change the maximum layer size by editing the YAML configuration file that is created when Red Hat Quay is first deployed. |
You must have podman
installed.
You must have a QCOW2 or RAW image file.
Create a Dockerfile to build the VM image into a container image. The VM image must be owned by QEMU, which has a UID of 107
, and placed in the /disk/
directory inside the container. Permissions for the /disk/
directory must then be set to 0440
.
The following example uses the Red Hat Universal Base Image (UBI) to handle these configuration changes in the first stage, and uses the minimal scratch
image in the second stage to store the result:
$ cat > Dockerfile << EOF
FROM registry.access.redhat.com/ubi8/ubi:latest AS builder
ADD --chown=107:107 <vm_image>.qcow2 /disk/ (1)
RUN chmod 0440 /disk/*
FROM scratch
COPY --from=builder /disk/* /disk/
EOF
1 | Where <vm_image> is the image in either QCOW2 or RAW format. If you use a remote image, replace <vm_image>.qcow2 with the complete URL. |
Build and tag the container:
$ podman build -t <registry>/<container_disk_name>:latest .
Push the container image to the registry:
$ podman push <registry>/<container_disk_name>:latest
You can disable TLS (transport layer security) for one or more container registries by editing the insecureRegistries
field of the HyperConverged
custom resource.
Open the HyperConverged
CR in your default editor by running the following command:
$ oc edit hyperconverged kubevirt-hyperconverged -n kubevirt-hyperconverged
Add a list of insecure registries to the spec.storageImport.insecureRegistries
field.
HyperConverged
custom resourceapiVersion: hco.kubevirt.io/v1beta1
kind: HyperConverged
metadata:
name: kubevirt-hyperconverged
namespace: kubevirt-hyperconverged
spec:
storageImport:
insecureRegistries: (1)
- "private-registry-example-1:5000"
- "private-registry-example-2:5000"
1 | Replace the examples in this list with valid registry hostnames. |
You can create a virtual machine (VM) by importing a container disk from a container registry by using the OKD web console.
Navigate to Virtualization → Catalog in the web console.
Click a template tile without an available boot source.
Click Customize VirtualMachine.
On the Customize template parameters page, expand Storage and select Registry (creates PVC) from the Disk source list.
Enter the container image URL. Example: https://mirror.arizona.edu/fedora/linux/releases/38/Cloud/x86_64/images/Fedora-Cloud-Base-38-1.6.x86_64.qcow2
Set the disk size.
Click Next.
Click Create VirtualMachine.
You can create a virtual machine (VM) from a container disk by using the command line.
You must have access credentials for the container registry that contains the container disk.
You must have the virtctl
command-line tool installed.
Create a VirtualMachine
manifest for your VM and save it as a YAML file. For example, to create a minimal Fedora VM from a container disk, run the following command:
$ virtctl create vm --name vm-rhel-9 --instancetype u1.small --preference rhel.9 --volume-containerdisk src:registry.redhat.io/rhel9/rhel-guest-image:9.5
Review the VirtualMachine
manifest for your VM:
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
name: vm-rhel-9 (1)
spec:
instancetype:
name: u1.small (2)
preference:
name: rhel.9 (3)
runStrategy: Always
template:
metadata:
creationTimestamp: null
spec:
domain:
devices: {}
resources: {}
terminationGracePeriodSeconds: 180
volumes:
- containerDisk:
image: registry.redhat.io/rhel9/rhel-guest-image:9.5 (4)
name: vm-rhel-9-containerdisk-0
1 | The VM name. |
2 | The instance type to use to control resource sizing of the VM. |
3 | The preference to use. |
4 | The URL of the container disk. |
Create the VM by running the following command:
$ oc create -f <vm_manifest_file>.yaml
Monitor the status of the VM:
$ oc get vm <vm_name>
If the provisioning is successful, the VM status is Running
:
NAME AGE STATUS READY
vm-rhel-9 18s Running True
Verify that provisioning is complete and that the VM has started by accessing its serial console:
$ virtctl console <vm_name>
If the VM is running and the serial console is accessible, the output looks as follows:
Successfully connected to vm-rhel-9 console. The escape sequence is ^]