Set up CDI Proxy

About this task

The Containerized Data Importer (CDI) project provides facilities for enabling PVCs to be used as disks for KubeVirt VMs by way of DataVolumes.

The CDI service is installed as part of uploading and applying the KubeVirt system application. The most common use case for CDI is ‘uploading a disk image to a DataVolume’. To use the CDI service, your Kubernetes cluster-admin should make the cdi-uploadproxy service accessible from outside the cluster. This can be done via NodePort service or Ingress service.

Configuring the NodePort service option is shown below:


  1. Create the CDI proxy yaml configuration.

    $ cat <<EOF > cdi-uploadproxy-nodeport-service.yaml apiVersion: v1
    kind: Service
      name: cdi-uploadproxy-nodeport
      namespace: cdi
      labels: "cdi-uploadproxy"
      type: NodePort
        - port: 443
        targetPort: 8443
        nodePort: 32111 # Use unused nodeport in 31,500 to 32,767 range
        protocol: TCP
    selector: cdi-uploadproxy
  2. Apply the configuration.

    $ kubectl apply -f cdi-uploadproxy-nodeport-service.yaml


Now the virtctl command can be used to upload a VM image file into an existing or new DataVolume (PVC).

See the example (Create an Ubuntu VM) that uploads an ubuntu cloud image (jammy-server-cloudimg-amd64.img from into a new 500G DataVolume named stx-lab-jenkins-disk:

$ virtctl image-upload dv stx-lab-jenkins-disk -n jenkins-ns --insecure \
  --access-mode ReadWriteOnce --size 500Gi --image-path \
  /home/sysadmin/admin/kubevirt/images/jammy-server-cloudimg-amd64.img     \

See sections on Create an Ubuntu VM and Create a Windows VM on how to then use this DataVolume to create/launch a VM.

See for more details and other use cases.