前言
虚拟机迁移主要有三种方式:P2V、V2V和V2P。P2V指迁移物理服务器上的操作系统及其上的应用软件和数据到VMM(Virtual Machine Monitor)管理的虚拟服务器中。V2V迁移是在虚拟机之间移动操作系统和数据。V2P 指把一个操作系统、应用程序和数据从一个虚拟机中迁移到物理机的主硬盘上,是 P2V 的逆操作。
V2V迁移又分为离线迁移和在线迁移。离线迁移也叫做常规迁移、静态迁移,在迁移之前需要将虚拟机关闭。在线迁移又称为实时迁移,是指保持虚拟机正常运行的同时进行迁移。本文要研究的,就是虚拟机的在线迁移。更多详细内容,请参考虚拟机迁移技术漫谈,第 1 部分。
迁移相关命令
本文研究的是OpenStack集群中的虚拟机迁移,那么先研究一下OpenStack的虚拟机迁移命令。主要参考Live-migrate instances、Block Live Migration in OpenStack environment。
PS:openstack server
可以换成nova
。
2、查看实例详情openstack server show 180617ec-1348-4144-a496-8751d12e84bf
PS:实例ID可以换成demo1。
3、查看可以迁移的节点openstack compute service list
4、查看其它节点资源使用情况openstack host list
openstack host show compute2
5、迁移nova live-migration 180617ec-1348-4144-a496-8751d12e84bf compute2
啊嘞,没有反应是闹哪样?查看实例详情,依然位于compute节点。
6、调试迁移nova live-migration 180617ec-1348-4144-a496-8751d12e84bf compute2 --debug
信息很多,找不到重点。在openstack热迁移和冷迁移一文中发现,在线迁移又可以分为两种:live migration和block migration。live migration需要实例保存在NFS共享存储中,这种迁移主要是实例的内存状态的迁移,速度应该会很快。block migration除了实例内存状态要迁移外,还得迁移磁盘文件,速度会慢些,但是它不要求实例存储在共享文件系统中。
而我们的这个集群,没有共享存储,所以应该用block migration?
7、再次迁移nova live-migration --block-migrate 180617ec-1348-4144-a496-8751d12e84bf compute2
修改后的命令,在shell中同样没有更多提示,但是查看horizon,发现了惊喜,正在迁移。等到迁移完成,查看实例详情,却发现,实例所在主机依然没有发生变化!
是因为nova没有配置好吗?很有可能,那么修改一下nova的配置试试。
nova配置
因为是使用kolla部署的OpenStack,所以修改配置重启服务的方法,和传统方法有所不同。参考kolla(Ocata)部署nova组件关键配置和volume映射和Openstack 之 调整nova相关参数。可以知道,主机中的/etc/kolla/nova-compute/nova.conf,对应容器中的/etc/nova/nova.conf。修改后重启容器,nova-compute服务配置就会发生改变。
1、在两个计算节点,修改nova.confvim /etc/kolla/nova-compute/nova.conf
,添加:
1 | live_migration_flag=VIR_MIGRATE_UNDEFINE_SOURCE,VIR_MIGRATE_PEER2PEER,VIR_MIGRATE_LIVE |
2、重启nova-compute
1 | docker stop nova_compute |
3、进入容器docker exec -it nova_compute /bin/bash
4、查看配置是否生效vi /etc/nova/nova.conf
再次迁移
1、在控制节点执行迁移命令nova live-migration --block-migrate 180617ec-1348-4144-a496-8751d12e84bf compute2
满怀期望,但是依然失败。
2、在计算节点查看日志tail -n 20 /var/lib/docker/volumes/kolla_logs/_data/nova/nova-compute.log
日志报错部分如下:
1 | 2018-11-13 19:12:04.614 6 ERROR nova.virt.libvirt.driver [req-e6654355-fcec-4b93-a662-c758a03766fa b2edc935f89d4d2684ec4039c02a21cc ab7e3eb8c00d4299afd8572e1ec437bf - default default] [instance: 180617ec-1348-4144-a496-8751d12e84bf] Live Migration failure: operation failed: Failed to connect to remote libvirt URI qemu+tcp://compute2/system: Unable to resolve address 'compute2' service '16509': Name or service not known: libvirtError: operation failed: Failed to connect to remote libvirt URI qemu+tcp://compute2/system: Unable to resolve address 'compute2' service '16509': Name or service not known |
由日志可以看出,问题出现在libvirt上,那么修改一下libvirt的配置。
libvirt配置
参考OpenStack虚拟机冷迁移与热迁移、虚拟机在 OpenStack 里没有共享存储条件下的在线迁移、虚拟化之KVM virsh常用命令篇,对libvirt的配置进行修改。
1、查看libvirtd.confvim /etc/kolla/nova-libvirt/libvirtd.conf
修改配置如下:
1 | listen_tcp = 1 |
2、重启libvirt服务
1 | docker stop nova_libvirt |
3、查看libvirt服务netstat -anpt | grep libvirt
看到libvirtd监听在0.0.0.0:16509端口即为正常。
PS:可以在其他节点使用virsh命令测试连通性virsh -c qemu+tcp://compute2/system
第三次迁移
1、在控制节点执行迁移命令nova live-migration --block-migrate 180617ec-1348-4144-a496-8751d12e84bf compute2
2、查看实例详情openstack server show demo1
迁移成功了,nice。
其他命令
1、查看迁移任务nova server-migration-list 180617ec-1348-4144-a496-8751d12e84bf
该命令查看到迁移任务的ID,然后根据这个ID就可以看到更详细的迁移过程。
2、查看迁移过程nova server-migration-show 180617ec-1348-4144-a496-8751d12e84bf 2
3、查看警告或者出错日志grep WARNING.*180617ec-1348-4144-a496-8751d12e84bf /var/lib/docker/volumes/kolla_logs/_data/nova/nova-compute.log
4、取消迁移nova live-migration-abort 180617ec-1348-4144-a496-8751d12e84bf 2
后记
以上,实现了OpenStack虚拟机的block live migration。后续实验,不妨再研究下共享存储的live migration。