KubeVirt
Today we’ll take a quick look at KubeVirt, A Kubernetes native virtualization solution.
While OpenShift and Kubernetes have been all about containers, as of 2018, we’ve started hearing about some weird idea: shipping virtual machines into containers.
Today, KubeVirt is fairly well integrated into OpenShift, which has its own Operator.
If like me, you’re running OpenShift on KVM guests, you’ll first have to make sure nested virtualization was enabled. With an Intel processor, we would look for the following:
$ cat /sys/module/kvm_intel/parameters/nested
Y
Or using AMD:
$ cat /sys/module/kvm_amd/parameters/nested
Y
Unless the above returns with `Y` or `1`, we need to enable nested
virtualization. First, shut down all guests. Then, reload your KVM module:
# modprobe -r kvm_intel
# modprobe kvm_intel nested=1
# cat /sys/module/kvm_intel/parameters/nested
# cat <
options kvm_intel nested=1
EOF
With AMD, use instead:
# modprobe -r kvm_amd
# modprobe kvm_amd nested=1
# cat /sys/module/kvm_amd/parameters/nested
# cat <
options kvm_amd nested=1
EOF
Reboot your guests, and confirm you can now find a `/dev/kvm` device:
$ ssh core@compute1.friends
Red Hat Enterprise Linux CoreOS 42.81.20191113.0
...
$ grep vmx /proc/cpuinfo
flags : xxx
...
$ ls /dev/kvm
/dev/kvm
Confirm OpenShift node-capability-detector did discover those devices:
$ oc describe node compute1.xxx
...
Allocatable:
cpu: 7500m
devices.kubevirt.io/kvm: 110
devices.kubevirt.io/tun: 110
devices.kubevirt.io/vhost-net: 110
Now, from the OperatorHub console, we would install the KubeVirt operator. While writing these lines, there are still some bugs, prefer using some lab cluster doing so.
Next, we’ll migrate a test KVM instance, from a regular hypervisor to OpenShift. Here, the first thing we would want to do is to provision a DataVolume.
DataVolumes are built on top of PersistentVolumeClaims, they’re meant to help dealing with persistent volumes, implementing data provisioning.
There’s two ways to go about this: either we can host our disks using a web server, and then we may use the following DataVolume definition:
apiVersion: cdi.kubevirt.io/v1alpha1
kind: DataVolume
metadata:
name: bluemind-demo
namespace: wsweet-demo
spec:
source:
http:
url: https://repository.undomaine.com/modeles/kvm/kvm-kubevirt/bm40.qcow2
pvc:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
Or we could use the virtctl client uploading an image from our system into OpenShift:
$ virtctl image-upload dv bluemind-demo --wait-secs=600 --size=8Gi --insecure --block-volume --image-path=/var/lib/libvirt/images/bm40-template.raw
DataVolume wsweet-demo/bluemind-demo created
Waiting for PVC bluemind-demo upload pod to be ready...
Pod now ready
Uploading data to https://cdi-uploadproxy-openshift-operators.apps.undomaine.com
...
The process of uploading a volume would start some temporary Pod, which would use a pair of PVC: one that would receive the final image, the other serving as a temporary storage while upload is running.
Once our image was uploaded, we would be able to create a VirtualMachine object:
apiVersion: kubevirt.io/v1alpha3
kind: VirtualMachine
metadata:
name: bluemind-demo
namespace: wsweet-demo
spec:
running: false
template:
metadata:
labels:
name: bluemind-demo
spec:
domain:
devices:
disks:
- disk:
bus: virtio
name: rootfs
interfaces:
- name: default
masquerade: {}
resources:
requests:
memory: 8Gi
cpu: "1"
networks:
- name: default
pod: {}
terminationGracePeriodSeconds: 600
volumes:
- dataVolume:
name: bluemind-demo
name: rootfs
$ oc get vm
...
bluemind-demo 2s false
$ virtctl start bluemind-demo
$ oc describe vm bluemind-demo
...
$ oc get vmi
...
bluemind-demo 3s Scheduling
$ oc get pods
...
virt-launcher-bluemind-demo-8kcxz 0/1 ContainerCreating 0 38s
Once that Pod is running, we should be able to attach our guest VNC console:
$ virtctl vnc bluemind-demo
Finish up configuring your system, you may have to rename your network
interfaces, reset IP addresses, fix DNS resolution integrating with OpenShift. Here, we could use cloud-init, or script our own contextualization, installing OpenShift Service CA, …