{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://kubevirt.io/schemas/virtualmachine.json", "title": "KubeVirt VirtualMachine", "description": "Schema for the KubeVirt VirtualMachine custom resource. A VirtualMachine defines the desired configuration and lifecycle management for a virtual machine running on Kubernetes, including CPU, memory, disks, networking, and run strategy.", "type": "object", "required": ["apiVersion", "kind", "metadata", "spec"], "properties": { "apiVersion": { "type": "string", "description": "API version of the VirtualMachine resource.", "const": "kubevirt.io/v1" }, "kind": { "type": "string", "description": "Resource kind.", "const": "VirtualMachine" }, "metadata": { "$ref": "#/$defs/ObjectMeta" }, "spec": { "$ref": "#/$defs/VirtualMachineSpec" }, "status": { "$ref": "#/$defs/VirtualMachineStatus" } }, "$defs": { "VirtualMachineSpec": { "type": "object", "description": "Specification of a VirtualMachine defining its configuration and lifecycle policy.", "properties": { "runStrategy": { "type": "string", "description": "Controls when the VM is running. 'Always' restarts automatically after crash. 'RerunOnFailure' restarts only on non-zero exit. 'Manual' requires explicit start/stop commands. 'Halted' keeps the VM stopped. 'Once' runs the VM once and stops it after completion.", "enum": ["Always", "RerunOnFailure", "Manual", "Halted", "Once"] }, "running": { "type": "boolean", "description": "Deprecated in favor of runStrategy. If true, the VM should be running." }, "template": { "$ref": "#/$defs/VirtualMachineInstanceTemplateSpec" }, "dataVolumeTemplates": { "type": "array", "description": "DataVolume templates managed as part of this VM's lifecycle.", "items": { "type": "object" } } } }, "VirtualMachineInstanceTemplateSpec": { "type": "object", "description": "Template for the VirtualMachineInstance created by this VM.", "properties": { "metadata": { "type": "object", "description": "Labels and annotations to apply to the VMI." }, "spec": { "$ref": "#/$defs/VirtualMachineInstanceSpec" } } }, "VirtualMachineInstanceSpec": { "type": "object", "description": "Specification of the virtual machine hardware and guest OS configuration.", "properties": { "domain": { "$ref": "#/$defs/DomainSpec" }, "networks": { "type": "array", "description": "Networks to attach VM interfaces to.", "items": { "$ref": "#/$defs/Network" } }, "volumes": { "type": "array", "description": "Storage volumes to attach as VM disks.", "items": { "$ref": "#/$defs/Volume" } }, "hostname": { "type": "string", "description": "Hostname to configure inside the guest OS.", "maxLength": 63, "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?$" }, "terminationGracePeriodSeconds": { "type": "integer", "description": "Seconds to wait for clean shutdown before forcing VM termination.", "minimum": 0 }, "evictionStrategy": { "type": "string", "description": "Behavior when the node is evicted. 'LiveMigrate' migrates the VM instead of stopping it.", "enum": ["LiveMigrate", "None"] }, "nodeSelector": { "type": "object", "description": "Node label selector for VM placement.", "additionalProperties": { "type": "string" } }, "priorityClassName": { "type": "string", "description": "PriorityClass name controlling scheduling priority." } } }, "DomainSpec": { "type": "object", "description": "Virtual hardware configuration for the VM guest domain.", "properties": { "cpu": { "type": "object", "description": "CPU configuration for the VM.", "properties": { "cores": { "type": "integer", "description": "Number of CPU cores per socket.", "minimum": 1 }, "sockets": { "type": "integer", "description": "Number of CPU sockets.", "minimum": 1 }, "threads": { "type": "integer", "description": "Number of hardware threads per core.", "minimum": 1 }, "model": { "type": "string", "description": "CPU model to emulate. Use 'host-model' or 'host-passthrough' to expose host CPU features." }, "dedicatedCpuPlacement": { "type": "boolean", "description": "Request dedicated CPU pinning via Kubernetes CPU Manager for real-time workloads." }, "isolateEmulatorThread": { "type": "boolean", "description": "If true, allocates an extra CPU for the QEMU emulator thread." } } }, "memory": { "type": "object", "description": "Memory configuration for the VM.", "properties": { "guest": { "type": "string", "description": "Memory allocated to the guest OS in Kubernetes resource format.", "examples": ["2Gi", "512Mi", "4G"] }, "hugepages": { "type": "object", "description": "Huge pages configuration for low-latency memory access.", "properties": { "pageSize": { "type": "string", "description": "Huge page size.", "enum": ["2Mi", "1Gi"] } } } } }, "devices": { "type": "object", "description": "Virtual device configuration for the guest.", "properties": { "disks": { "type": "array", "description": "Disk devices attached to the VM.", "items": { "$ref": "#/$defs/Disk" } }, "interfaces": { "type": "array", "description": "Network interface devices.", "items": { "$ref": "#/$defs/Interface" } }, "autoattachPodInterface": { "type": "boolean", "description": "If false, the default pod network interface is not attached." }, "autoattachSerialConsole": { "type": "boolean", "description": "If false, the serial console is not attached." }, "autoattachGraphicsDevice": { "type": "boolean", "description": "If false, the default VGA graphics device is not attached." }, "rng": { "type": "object", "description": "VirtIO random number generator device." }, "blockMultiQueue": { "type": "boolean", "description": "If true, enables multi-queue for block devices." }, "networkInterfaceMultiQueue": { "type": "boolean", "description": "If true, enables multi-queue for network interfaces." } } }, "firmware": { "type": "object", "description": "Firmware configuration for the guest.", "properties": { "bootloader": { "type": "object", "description": "Bootloader configuration.", "properties": { "bios": { "type": "object", "description": "Legacy BIOS bootloader." }, "efi": { "type": "object", "description": "EFI/UEFI bootloader.", "properties": { "secureBoot": { "type": "boolean", "description": "Enable UEFI Secure Boot." } } } } }, "uuid": { "type": "string", "format": "uuid", "description": "SMBIOS UUID for the VM." }, "serial": { "type": "string", "description": "SMBIOS serial number exposed to the guest." } } }, "machine": { "type": "object", "description": "Machine type configuration.", "properties": { "type": { "type": "string", "description": "QEMU machine type.", "examples": ["q35", "pc-q35-rhel9.2.0"] } } }, "features": { "type": "object", "description": "Emulated hardware feature flags.", "properties": { "acpi": { "type": "object", "description": "ACPI support." }, "smm": { "type": "object", "description": "System Management Mode." }, "hyperv": { "type": "object", "description": "Hyper-V enlightenments for improved Windows VM performance." } } } } }, "Disk": { "type": "object", "description": "A virtual disk device attached to the VM.", "required": ["name"], "properties": { "name": { "type": "string", "description": "Name of the disk, must match a volume name in the spec.volumes list." }, "bootOrder": { "type": "integer", "description": "Boot priority for this disk (1 is highest priority).", "minimum": 1 }, "disk": { "type": "object", "description": "VirtIO or emulated disk device.", "properties": { "bus": { "type": "string", "description": "Disk bus type.", "enum": ["virtio", "sata", "scsi", "ide"] }, "pciAddress": { "type": "string", "description": "PCI address for the disk device." } } }, "cdrom": { "type": "object", "description": "CD-ROM device.", "properties": { "bus": { "type": "string", "enum": ["virtio", "sata", "scsi"] }, "readonly": { "type": "boolean", "description": "If true, the CD-ROM is read-only." } } }, "lun": { "type": "object", "description": "LUN device for passthrough storage.", "properties": { "bus": { "type": "string", "enum": ["scsi"] } } }, "io": { "type": "string", "description": "I/O mode for this disk.", "enum": ["native", "threads", "io_uring"] }, "cache": { "type": "string", "description": "Disk cache mode.", "enum": ["writethrough", "writeback", "none"] }, "dedicatedIOThread": { "type": "boolean", "description": "If true, uses a dedicated I/O thread for this disk." } } }, "Interface": { "type": "object", "description": "A virtual network interface device.", "required": ["name"], "properties": { "name": { "type": "string", "description": "Name of the interface, must match a network name in spec.networks." }, "model": { "type": "string", "description": "NIC model type. virtio is recommended for performance.", "enum": ["virtio", "e1000", "e1000e", "rtl8139"] }, "macAddress": { "type": "string", "description": "Fixed MAC address for this interface.", "pattern": "^([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}$" }, "masquerade": { "type": "object", "description": "NAT masquerade networking. Default mode for pod network." }, "bridge": { "type": "object", "description": "Bridge networking connecting to a host bridge interface." }, "sriov": { "type": "object", "description": "SR-IOV network passthrough for high-performance networking." }, "binding": { "type": "object", "description": "Custom network binding plugin reference.", "properties": { "name": { "type": "string", "description": "Name of the binding plugin." } } }, "ports": { "type": "array", "description": "Port forwarding rules (masquerade mode only).", "items": { "type": "object", "properties": { "name": { "type": "string", "description": "Name of the port forwarding rule." }, "port": { "type": "integer", "description": "Port number to forward.", "minimum": 1, "maximum": 65535 }, "protocol": { "type": "string", "description": "Protocol to forward.", "enum": ["TCP", "UDP"] } } } } } }, "Network": { "type": "object", "description": "A network to attach a VM interface to.", "required": ["name"], "properties": { "name": { "type": "string", "description": "Name of the network, referenced by the interface name." }, "pod": { "type": "object", "description": "Default pod network (cluster-internal).", "properties": { "vmNetworkCIDR": { "type": "string", "description": "CIDR for the VM's internal network in masquerade mode." } } }, "multus": { "type": "object", "description": "Secondary network via Multus CNI.", "required": ["networkName"], "properties": { "networkName": { "type": "string", "description": "Name of the NetworkAttachmentDefinition resource." }, "default": { "type": "boolean", "description": "If true, this Multus network is the default network." } } } } }, "Volume": { "type": "object", "description": "A storage volume providing disk data for a VM disk device.", "required": ["name"], "properties": { "name": { "type": "string", "description": "Name of the volume, referenced by the disk name." }, "containerDisk": { "type": "object", "description": "OCI container image used as an ephemeral disk.", "required": ["image"], "properties": { "image": { "type": "string", "description": "OCI image reference containing the disk image.", "examples": ["quay.io/containerdisks/fedora:latest"] }, "imagePullPolicy": { "type": "string", "enum": ["Always", "Never", "IfNotPresent"] } } }, "dataVolume": { "type": "object", "description": "CDI DataVolume providing the disk data.", "required": ["name"], "properties": { "name": { "type": "string", "description": "Name of the DataVolume resource." } } }, "persistentVolumeClaim": { "type": "object", "description": "Kubernetes PVC used directly as a disk.", "required": ["claimName"], "properties": { "claimName": { "type": "string", "description": "Name of the PersistentVolumeClaim." }, "readOnly": { "type": "boolean", "description": "If true, mounts the PVC read-only." } } }, "cloudInitNoCloud": { "type": "object", "description": "Cloud-init NoCloud configuration disk.", "properties": { "userData": { "type": "string", "description": "Cloud-init user-data script or config." }, "networkData": { "type": "string", "description": "Cloud-init network-config data." }, "userDataSecretRef": { "type": "object", "description": "Secret reference for user-data.", "properties": { "name": { "type": "string" } } } } }, "cloudInitConfigDrive": { "type": "object", "description": "Cloud-init Config Drive configuration disk.", "properties": { "userData": { "type": "string" }, "networkData": { "type": "string" } } }, "emptyDisk": { "type": "object", "description": "Ephemeral empty disk created for the VM lifetime.", "required": ["capacity"], "properties": { "capacity": { "type": "string", "description": "Disk capacity in Kubernetes resource quantity format.", "examples": ["20Gi", "100Gi"] } } }, "sysprep": { "type": "object", "description": "Windows Sysprep answer file disk.", "properties": { "configMap": { "type": "object", "properties": { "name": { "type": "string", "description": "Name of the ConfigMap with Sysprep data." } } }, "secret": { "type": "object", "properties": { "name": { "type": "string" } } } } } } }, "VirtualMachineStatus": { "type": "object", "description": "Observed status of a VirtualMachine.", "properties": { "printableStatus": { "type": "string", "description": "Human-readable VM status string.", "enum": [ "Stopped", "Provisioning", "Starting", "Running", "Paused", "Migrating", "Stopping", "Terminating", "CrashLoopBackOff", "Unknown", "WaitingForVolumeBinding" ] }, "ready": { "type": "boolean", "description": "Whether the VM is ready and accepting connections." }, "created": { "type": "boolean", "description": "Whether a VirtualMachineInstance has been created." }, "conditions": { "type": "array", "description": "Status conditions for the VM.", "items": { "type": "object", "properties": { "type": { "type": "string" }, "status": { "type": "string", "enum": ["True", "False", "Unknown"] }, "reason": { "type": "string" }, "message": { "type": "string" }, "lastTransitionTime": { "type": "string", "format": "date-time" } } } } } }, "ObjectMeta": { "type": "object", "description": "Standard Kubernetes object metadata.", "required": ["name"], "properties": { "name": { "type": "string", "description": "Name of the VirtualMachine resource.", "maxLength": 253 }, "namespace": { "type": "string", "description": "Namespace the VirtualMachine belongs to." }, "labels": { "type": "object", "description": "Labels for organizing and selecting the VM.", "additionalProperties": { "type": "string" } }, "annotations": { "type": "object", "description": "Non-identifying metadata for the VM.", "additionalProperties": { "type": "string" } } } } }, "examples": [ { "apiVersion": "kubevirt.io/v1", "kind": "VirtualMachine", "metadata": { "name": "fedora-vm", "namespace": "default", "labels": { "app": "fedora-vm" } }, "spec": { "runStrategy": "Always", "template": { "spec": { "domain": { "cpu": { "cores": 2, "sockets": 1, "threads": 1 }, "memory": { "guest": "4Gi" }, "devices": { "disks": [ { "name": "rootdisk", "disk": { "bus": "virtio" }, "bootOrder": 1 }, { "name": "cloudinitdisk", "disk": { "bus": "virtio" } } ], "interfaces": [ { "name": "default", "model": "virtio", "masquerade": {} } ] } }, "networks": [ { "name": "default", "pod": {} } ], "volumes": [ { "name": "rootdisk", "dataVolume": { "name": "fedora-dv" } }, { "name": "cloudinitdisk", "cloudInitNoCloud": { "userData": "#cloud-config\npassword: fedora\nchpasswd: { expire: False }" } } ] } }, "dataVolumeTemplates": [ { "metadata": { "name": "fedora-dv" }, "spec": { "source": { "registry": { "url": "docker://quay.io/containerdisks/fedora:38" } }, "storage": { "resources": { "requests": { "storage": "20Gi" } } } } } ] } } ] }