Guided Exercise: Installing KubeVirt
Set up your Kubernetes cluster
In order to install KubeVirt, you need to have a Kubernetes cluster you can access via kubectl commands, and be logged in as a user who can create namespaces and cluster resources, typically a cluster admin.
Minikube and Kind clusters are sufficient to try out basic KubeVirt functionality, but it is recommended to install a container network interface (CNI) like flannel. See documentation for your preferred cluster installation to see how to do this.
Grab the latest version of KubeVirt
We start by picking up the latest version of KubeVirt and setting an environment variable KUBEVIRT_VERSION for later commands:
KUBEVIRT_VERSION=$(curl -s https://api.github.com/repos/kubevirt/kubevirt/releases/latest | awk -F '[ \t":]+' '/tag_name/ {print $3}')
The command above reads GitHub's list of KubeVirt releases in latest first order, filters out any non stable releases, and prints the version string at the top of the list. At the time of this writing, the latest KubeVirt release is "v0.59.0".
Next, we use kubectl to install the KUBEVIRT_VERSION release of the KubeVirt operator:
kubectl create -f https://github.com/kubevirt/kubevirt/releases/download/${KUBEVIRT_VERSION}/kubevirt-operator.yaml
This command will create a namespace, "kubevirt" and install the Custom Resource Definitions for KubeVirt we described earlier, as well as an operator that will wait for a configuration resource to launch the KubeVirt installation.
Now we add the Kubevirt Custom Resource (called kubevirt) that will trigger the KubeVirt operator to install the rest of KubeVirt:
kubectl create -f https://github.com/kubevirt/kubevirt/releases/download/${KUBEVIRT_VERSION}/kubevirt-cr.yaml
To nest or not to nest
In some test environments, such as when minikube needs to run in a VM on your workstation, you may not have direct access to your local virtualization hardware, and may need to enable emulation mode:
kubectl -n kubevirt patch kubevirt kubevirt --type=merge --patch '{"spec":{"configuration":{"developerConfiguration":{"useEmulation":true}}}}'
If in doubt, skip this for now. If VMs fail to schedule because no nodes were found with kvm, you can patch and try again.
Install the KubeVirt client, virtctl
Depending on whether the Kubernetes cluster you are running on is a test environment like Minikube, it may take several minutes to get everything up and running. While we wait for that, we can take the time to download the virtctl command line client for KubeVirt:
curl -Lo virtctl https://github.com/kubevirt/kubevirt/releases/download/${KUBEVIRT_VERSION}/virtctl-${KUBEVIRT_VERSION}-linux-amd64
To make sure the downloaded binary is executable, run:
chmod +x virtctl
It is recommended to place the virtctl binary somewhere in your shell's PATH such as $HOME/.local/bin
or /usr/local/bin
Note that these are instructions for downloading a Linux 64 bit Intel compatible binary, if your own platform differs, have a look at https://github.com/kubevirt/kubevirt/releases/latest and scroll down. Currently, there are also versions for Apple MacOSX and Microsoft Windows.
Wait for KubeVirt to fully deploy
We can check the KubeVirt deployment in several different ways. To get the most concise yes or no answer, we check the phase of the Kubevirt CR itself:
kubectl -n kubevirt get kubevirt
Once KubeVirt fully deploys, it will show:
NAME AGE PHASE kubevirt 3m Deployed
For a more detailed view of what is being installed, (and to help understand if there are problems with the installation) you can list the Pods running in the kubevirt Namespace:
kubectl get pods -n kubevirt
Once the deployment finishes, this should look similar to:
NAME READY STATUS RESTARTS AGE virt-api-7fc57db6dd-g4s4w 1/1 Running 0 3m virt-api-7fc57db6dd-zd95q 1/1 Running 0 3m virt-controller-6849d45bcc-88zd4 1/1 Running 0 3m virt-controller-6849d45bcc-cmfzk 1/1 Running 0 3m virt-handler-fvsqw 1/1 Running 0 3m virt-operator-5649f67475-gmphg 1/1 Running 0 4m virt-operator-5649f67475-sw78k 1/1 Running 0 4m