文章大纲
部署完 KubeVirt 后,可以通过创建一个测试虚拟机来验证 KubeVirt 是否正常工作。
部署虚拟机
VM 是命名空间中的资源,可以创建一个命名空间:
vagrant@master01:~$ kubectl create ns testvm
namespace/testvm created
KubeVirt 官网提供了一个简单的 vm 资源定义:
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:
vagrant@master01:~$ kubectl -n testvm apply -f https://kubevirt.io/labs/manifests/vm.yaml
virtualmachine.kubevirt.io/testvm created
查看状态:
vagrant@master01:~$ kubectl get vm -n testvm
NAME AGE STATUS READY
testvm 34s Stopped False
testvm
处于 Stopped 的状态,是因为在资源定义中,设置了 running: false
,所以需要手动启动。
同时可以看到在 VM 没有启动的时候是不存在 virt-launcher
Pod 和 VMI 资源的。
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:
vagrant@master01:~$ virtctl -n testvm start testvm
VM testvm was scheduled to start
启动后,查看资源状态:
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
连接到虚拟机:
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 连接到虚拟机:
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
命令:
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
:
vagrant@master01:~$ kubectl -n testvm patch vm testvm --type=merge --patch '{"spec":{"running": true}}'
virtualmachine.kubevirt.io/testvm patched
删除 VMI :
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 删除:
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.