部署完 KubeVirt 后,可以通过创建一个测试虚拟机来验证 KubeVirt 是否正常工作。

部署虚拟机

VM 是命名空间中的资源,可以创建一个命名空间:

1
2
vagrant@master01:~$ kubectl create ns testvm
namespace/testvm created

KubeVirt 官网提供了一个简单的 vm 资源定义:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
name: testvm
spec:
running: false
template:
metadata:
labels:
kubevirt.io/size: small
kubevirt.io/domain: testvm
spec:
domain:
devices:
disks:
- name: containerdisk
disk:
bus: virtio
- name: cloudinitdisk
disk:
bus: virtio
interfaces:
- name: default
masquerade: {}
resources:
requests:
memory: 64M
networks:
- name: default
pod: {}
volumes:
- name: containerdisk
containerDisk:
image: quay.io/kubevirt/cirros-container-disk-demo
- name: cloudinitdisk
cloudInitNoCloud:
userDataBase64: SGkuXG4=

这个文件来自于 https://kubevirt.io/labs/manifests/vm.yaml

部署 vm:

1
2
3
vagrant@master01:~$ kubectl -n testvm apply -f https://kubevirt.io/labs/manifests/vm.yaml

virtualmachine.kubevirt.io/testvm created

查看状态:

1
2
3
vagrant@master01:~$ kubectl get vm -n testvm
NAME AGE STATUS READY
testvm 34s Stopped False

testvm 处于 Stopped 的状态,是因为在资源定义中,设置了 running: false,所以需要手动启动。
同时可以看到在 VM 没有启动的时候是不存在 virt-launcher Pod 和 VMI 资源的。

1
2
3
4
vagrant@master01:~$ kubectl get vmi -n testvm
No resources found in testvm namespace.
vagrant@master01:~$ kubectl get pod -n testvm
No resources found in testvm namespace.

使用 virtctl 进行启动 VM:

1
2
vagrant@master01:~$ virtctl -n testvm start testvm
VM testvm was scheduled to start

启动后,查看资源状态:

1
2
3
4
5
6
7
8
9
vagrant@master01:~$ kubectl -n testvm get vm,vmi,pod
NAME AGE STATUS READY
virtualmachine.kubevirt.io/testvm 3m44s Running True

NAME AGE PHASE IP NODENAME READY
virtualmachineinstance.kubevirt.io/testvm 30s Running 10.244.241.89 master01 True

NAME READY STATUS RESTARTS AGE
pod/virt-launcher-testvm-nlwd4 3/3 Running 0 30s

访问虚拟机

借助 virtctl 可以通过 console vnc 或 ssh 访问虚拟机。

serial console

通过 virtctl console 连接到虚拟机:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vagrant@master01:~$ virtctl -n testvm 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:
$ uname -a
Linux testvm 4.4.0-28-generic #47-Ubuntu SMP Fri Jun 24 10:09:13 UTC 2016 x86_64 GNU/Linux
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 253:0 0 44M 0 disk
|-vda1 253:1 0 35M 0 part /
`-vda15 253:15 0 8M 0 part
vdb 253:16 0 1M 0 disk

通过 ctrl + ] 退出。

ssh

借助 virtctl ssh 可以通过 SSH 连接到虚拟机:

1
2
3
4
5
6
7
8
9
10
11
vagrant@master01:~$ virtctl ssh cirros@testvm.testvm
The authenticity of host 'vmi/testvm.testvm:22 (192.168.121.1:7890)' can't be established.
ECDSA key fingerprint is SHA256:DlsqNiPTxNrBsy+VldgVLJT7qKbyynH+Dxqj2s4Q7oU.
Are you sure you want to continue connecting (yes/no)? yes
cirros@vmi/testvm.testvm's password:
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 253:0 0 44M 0 disk
|-vda1 253:1 0 35M 0 part /
`-vda15 253:15 0 8M 0 part
vdb 253:16 0 1M 0 disk

cirros@testvm.testvm 中 cirros@testvm 代表使用 cirros 用户登陆到 testvm 虚拟机中,.testvm 代表虚拟机位于 testvm 命名空间中,也可以通过 -n 来指定。

vnc

使用 virtctl vnc testvm -n testvm 可以打开 vnc 控制台,这个依赖于图形化环境和 remote-viewer 软件包,目前我节点没有图形化,这个不演示了。

关闭和删除虚拟机

关闭虚拟机可以使用 virtctl stop 命令:

1
2
3
4
5
vagrant@master01:~$ virtctl stop testvm -n testvm
VM testvm was scheduled to stop
vagrant@master01:~$ kubectl get vm,vmi -n testvm
NAME AGE STATUS READY
virtualmachine.kubevirt.io/testvm 11m Stopped False

要删除虚拟机,需要删除 VM 资源,如果不删除 VM 资源,仅删除 VMI 资源,会导致 VMI 重新构建。

只删除 VMI

为了更好的演示删除 VMI 会自动创建 VMI,首选需要将 VM 中的 running: false 修改为 true:

1
2
vagrant@master01:~$ kubectl -n testvm patch vm testvm --type=merge --patch '{"spec":{"running": true}}'
virtualmachine.kubevirt.io/testvm patched

删除 VMI :

1
2
3
4
5
6
7
8
vagrant@master01:~$ kubectl  -n testvm get vmi
NAME AGE PHASE IP NODENAME READY
testvm 31s Running 10.244.241.90 master01 True
vagrant@master01:~$ kubectl -n testvm delete vmi testvm
virtualmachineinstance.kubevirt.io "testvm" deleted
vagrant@master01:~$ kubectl -n testvm get vmi
NAME AGE PHASE IP NODENAME READY
testvm 18s Running 10.244.241.91 master01 True

可以看到删除 VMI 后,又重新构建了 VMI,IP 是不一样的。

删除 VM

正确的流程应该是先手动停止 VMI,然后将 VM 删除:

1
2
3
4
5
6
7
8
vagrant@master01:~$ virtctl -n testvm stop testvm
VM testvm was scheduled to stop
vagrant@master01:~$ kubectl get vmi -n testvm
No resources found in testvm namespace.
vagrant@master01:~$ kubectl delete vm testvm -n testvm
virtualmachine.kubevirt.io "testvm" deleted
vagrant@master01:~$ kubectl get vm,vmi -n testvm
No resources found in testvm namespace.