1. 前言
《虚拟机在线迁移实验》一文中提到,迁移过程中的downtime不合理,但是没有找到原因。
本文,我们来使用Libvirt进行虚拟机在线迁移,如果downtime在毫秒级,那么说明问题出在OpenStack上。参考An analysis of the performance of live migration in Openstack的评论部分,可以发现有人遇到的同样的问题,downtime远大于1s。作者的猜测是libvirt的设置引起的,也可能是由于迁移后网络适应速度较慢造成的。
参考文档:KVM 虚拟机在物理主机之间迁移的实现
2. 实验环境
参考《使用Libvirt创建虚拟机》一文,在node0和node1两个节点上安装libvirt和qemu,IP分别为192.168.56.200和192.168.56.201。
2.1. NFS
要想进行虚拟机的迁移,首先迁出主机(node0)和迁入主机(node1)存放虚拟机磁盘的目录结构要相同。
参考文档《Linux中安装NFS》,在node0安装nfs-server,node1安装nfs-client。
配置node0的nfs服务路径为:
1 | 192.168.56.200:/opt/qemu |
配置node1挂载nfs目录:
1 | mkdir /opt/qemu |
2.2. libvirt端口配置
1、测试连接virsh -c qemu+tcp://node1/system
提示:
1 | error: failed to connect to the hypervisor |
2、在node0和node1调整libvirt的配置vim /etc/libvirt/libvirtd.conf
,如下修改:
1 | # line 22, uncomment |
3、重启libvirtservice libvirtd restart
4、查看libvirt服务netstat -anpt | grep libvirt
理论上应该看到监听16509,但是没有。
5、修改libvirt-bin.conf配置(可选)vim /etc/init/libvirt-bin.conf
,如下修改:
1 | # line 11, add -l |
6、重启libvirt-bin(可选)service libvirt-bin restart
依然没有监听16509端口。
vim /etc/init/libvirt-bin.conf
,如下修改:
1 | # line 58, add -l |
重启libvirt-bin依然无效。
7、还原libvirt-bin.conf,修改libvirt-binvim /etc/default/libvirt-bin
,如下修改:
1 | # line 8, uncomment and change |
重启libvirt-bin,发现端口监听成功。
8、再次测试连接virsh -c qemu+tcp://node1/system
连接成功,nice。
2.3. 免密登录
虚拟机迁移,可以使用普通用户,也可以使用root用户。
如果是普通用户进行迁移,那么在输入迁移命令后,需要输入node1中普通用户的密码。
如果是root用户进行迁移,那么在输入迁移命令后,同样需要输入node1中root用户的密码。但是,root用户并没有启用密码登录,所以,需要给root用户设置免密登录。
1、在node0上创建密钥对ssh-keygen
所有的提示按enter键即可,完成后在home目录执行ll .ssh,即可看到创建好的id_rsa和id_rsa.pub文件。
2、把公钥拷贝到所有客户机中ssh-copy-id -i .ssh/id_rsa.pub -p 22 voidking@node1
3、在node1中使用root用户执行cp -r /home/voidking/.ssh ~
同样的,也给node1添加免密登录node0。
3. 虚拟机迁移
参考kvm虚拟机迁移,进行虚拟机动态迁移。
1、在node0查看虚拟机virsh list
2、虚拟机迁移virsh migrate --live --verbose cirros qemu+ssh://node1/system tcp://node1 --unsafe
其中node1
可以换成root@node1
。
4. 后记
本来打算在《Libvirt虚拟机网络配置》一文中配置好网络,使得node0可以访问到node1中的实例,node1可以访问到node0中的实例。但是,配置失败了。所以,就无法测试虚拟机迁移的停机时间了。如果之后解决了桥接的问题,就再来更新。