Ubuntu 26.04

Kubernetes : Install KubeVirt2026/05/15

 

Install KubeVirt to deploy fully virtualized virtual machines in Kubernetes Cluster.

This example is based on the environment like follows.

+----------------------+   +----------------------+
|  [ ctrl.srv.world ]  |   |   [ dlp.srv.world ]  |
|     Manager Node     |   |     Control Plane    |
+-----------+----------+   +-----------+----------+
        eth0|10.0.0.25             eth0|10.0.0.30
            |                          |
------------+--------------------------+-----------
            |                          |
        eth0|10.0.0.51             eth0|10.0.0.52
+-----------+----------+   +-----------+----------+
| [ node01.srv.world ] |   | [ node02.srv.world ] |
|     Worker Node#1    |   |     Worker Node#2    |
+----------------------+   +----------------------+

[1] Install KubeVirt and virtctl command.
root@ctrl:~#
export VERSION=$(curl https://storage.googleapis.com/kubevirt-prow/release/kubevirt/kubevirt/stable.txt)

root@ctrl:~#
wget https://github.com/kubevirt/kubevirt/releases/download/${VERSION}/kubevirt-operator.yaml

root@ctrl:~#
wget https://github.com/kubevirt/kubevirt/releases/download/${VERSION}/kubevirt-cr.yaml

root@ctrl:~#
wget https://github.com/kubevirt/kubevirt/releases/download/${VERSION}/virtctl-${VERSION}-linux-amd64
root@ctrl:~#
mv virtctl-${VERSION}-linux-amd64 /usr/local/bin/virtctl

root@ctrl:~#
chmod 755 /usr/local/bin/virtctl
root@ctrl:~#
kubectl apply -f kubevirt-operator.yaml

namespace/kubevirt created
customresourcedefinition.apiextensions.k8s.io/kubevirts.kubevirt.io created
priorityclass.scheduling.k8s.io/kubevirt-cluster-critical created
clusterrole.rbac.authorization.k8s.io/kubevirt.io:operator created
serviceaccount/kubevirt-operator created
role.rbac.authorization.k8s.io/kubevirt-operator created
rolebinding.rbac.authorization.k8s.io/kubevirt-operator-rolebinding created
clusterrole.rbac.authorization.k8s.io/kubevirt-operator created
clusterrolebinding.rbac.authorization.k8s.io/kubevirt-operator created
Warning: spec.template.spec.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[1].matchExpressions[0].key: node-role.kubernetes.io/master is use "node-role.kubernetes.io/control-plane" instead
deployment.apps/virt-operator created

root@ctrl:~#
kubectl apply -f kubevirt-cr.yaml

kubevirt.kubevirt.io/kubevirt created
# after a few minutes, the pods will start up as follows

root@ctrl:~#
kubectl get pods -n kubevirt

NAME                               READY   STATUS    RESTARTS   AGE
virt-api-6c6d79fdf7-686m8          1/1     Running   0          5m4s
virt-api-6c6d79fdf7-r4pt4          1/1     Running   0          5m4s
virt-controller-58cbb998f8-srbzz   1/1     Running   0          4m34s
virt-controller-58cbb998f8-zcdnz   1/1     Running   0          4m34s
virt-handler-2zflr                 1/1     Running   0          4m34s
virt-handler-jj946                 1/1     Running   0          4m34s
virt-operator-5889fcb959-6bttf     1/1     Running   0          5m55s
virt-operator-5889fcb959-6mw8p     1/1     Running   0          5m55s
[2] Create a test VM and verify it works normally.
ubuntu@ctrl:~$
wget https://raw.githubusercontent.com/kubevirt/kubevirt.github.io/master/labs/manifests/vm.yaml

ubuntu@ctrl:~$
kubectl apply -f vm.yaml

virtualmachine.kubevirt.io/testvm created
ubuntu@ctrl:~$
kubectl get vms

NAME     AGE   STATUS    READY
testvm   7s    Stopped   False

# start VM

ubuntu@ctrl:~$
virtctl start testvm

VM testvm was scheduled to start
ubuntu@ctrl:~$
kubectl get vms

NAME     AGE   STATUS    READY
testvm   43s   Running   True

ubuntu@ctrl:~$
kubectl get vmi

NAME     AGE   PHASE     IP               NODENAME           READY
testvm   34s   Running   192.168.40.199   node01.srv.world   True

# connect to the console of VM

ubuntu@ctrl:~$
virtctl console testvm

Successfully connected to testvm console. The escape sequence is ^]

login as 'cirros' user. default password: 'gocubsgo'. use 'sudo' for root.
testvm login: cirros
Password:
$ 
# to go back to the Host's console, push Ctrl + ] key
# * same operation as virsh command
ubuntu@ctrl:~$


# connect to VM via ssh
# user is 'cirros' and password is 'gocubsgo'

ubuntu@ctrl:~$
kubectl get pods

NAME                         READY   STATUS    RESTARTS   AGE
virt-launcher-testvm-w6wqs   3/3     Running   0          81s

ubuntu@ctrl:~$
kubectl port-forward pod/virt-launcher-testvm-w6wqs 2220:22 &
ubuntu@ctrl:~$
ssh cirros@localhost -p 2220

Handling connection for 2220
The authenticity of host '[localhost]:2220 ([127.0.0.1]:2220)' can't be established.
ECDSA key fingerprint is: SHA256:14MVzmk5MJW3v0xj0pJWFSpcqkhjnFW9s+y9d7AuLJo
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[localhost]:2220' (ECDSA) to the list of known hosts.
** WARNING: connection is not using a post-quantum key exchange algorithm.
** This session may be vulnerable to "store now, decrypt later" attacks.
** The server may need to be upgraded. See https://openssh.com/pq.html
cirros@localhost's password:
$ 
$ uname -a
Linux testvm 4.4.0-28-generic #47-Ubuntu SMP Fri Jun 24 10:09:13 UTC 2016 x86_64 GNU/Linux
$ cat /etc/os-release
NAME=Buildroot
VERSION=2015.05-g31af4e3-dirty
ID=buildroot
VERSION_ID=2015.05
PRETTY_NAME="Buildroot 2015.05"
$ exit
Connection to localhost closed.

# stop VM

ubuntu@ctrl:~$
virtctl stop testvm

VM testvm was scheduled to stop
ubuntu@ctrl:~$
kubectl get vms

NAME     AGE     STATUS    READY
testvm   4m30s   Stopped   False

# delete VM

ubuntu@ctrl:~$
kubectl delete vm testvm

virtualmachine.kubevirt.io "testvm" deleted
ubuntu@ctrl:~$
kubectl get vms

No resources found in default namespace.
Matched Content