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:

Procedure

  1. Create the CDI proxy yaml configuration.

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

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

Results

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 https://cloud-images.ubuntu.com/jammy/current/) into a new 500G DataVolume named stx-lab-jenkins-disk:

$ virtctl image-upload dv <DV-Name> -n <NameSpace> --insecure \
  --access-mode ReadWriteOnce --size <size>Gi --image-path <Image-Path> \
  --uploadproxy-url https://<NodeIP>:<PORT>

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 https://kubevirt.io/user-guide/operations/containerized_data_importer/ for more details and other use cases.