一个计算机技术爱好者与学习者

0%

使用Libvirt进行虚拟机在线迁移

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
2
3
mkdir /opt/qemu
mount -t nfs 192.168.56.200:/opt/qemu /opt/qemu
chmod -R 777 /opt/qemu

2.2. libvirt端口配置

1、测试连接
virsh -c qemu+tcp://node1/system

提示:

1
2
error: failed to connect to the hypervisor
error: unable to connect to server at 'node1:16509': Connection refused

2、在node0和node1调整libvirt的配置
vim /etc/libvirt/libvirtd.conf,如下修改:

1
2
3
4
5
6
7
8
9
10
# line 22, uncomment
listen_tls = 0
# line 33, uncomment
listen_tcp = 1
# line 45, uncomment
tcp_port = "16509"
# line 55, uncomment and change
listen_addr = "0.0.0.0"
# line 163, uncomment and change
auth_tcp = "none"

3、重启libvirt
service libvirtd restart

4、查看libvirt服务
netstat -anpt | grep libvirt
理论上应该看到监听16509,但是没有。

5、修改libvirt-bin.conf配置(可选)
vim /etc/init/libvirt-bin.conf,如下修改:

1
2
# line 11, add -l
env libvirtd_opts="-d -l"

6、重启libvirt-bin(可选)
service libvirt-bin restart
依然没有监听16509端口。

vim /etc/init/libvirt-bin.conf,如下修改:

1
2
# line 58, add -l
exec /usr/sbin/libvirtd $libvirtd_opts -l

重启libvirt-bin依然无效。

7、还原libvirt-bin.conf,修改libvirt-bin
vim /etc/default/libvirt-bin,如下修改:

1
2
# line 8, uncomment and change
libvirtd_opts="-d -l"

重启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中的实例。但是,配置失败了。所以,就无法测试虚拟机迁移的停机时间了。如果之后解决了桥接的问题,就再来更新。