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

0%

好好学OpenStack:OpenStack中虚拟机的在线迁移

1. 前言

虚拟机迁移主要有三种方式:P2V、V2V和V2P。P2V指迁移物理服务器上的操作系统及其上的应用软件和数据到VMM(Virtual Machine Monitor)管理的虚拟服务器中。V2V迁移是在虚拟机之间移动操作系统和数据。V2P 指把一个操作系统、应用程序和数据从一个虚拟机中迁移到物理机的主硬盘上,是 P2V 的逆操作。

V2V迁移又分为离线迁移和在线迁移。离线迁移也叫做常规迁移、静态迁移,在迁移之前需要将虚拟机关闭。在线迁移又称为实时迁移,是指保持虚拟机正常运行的同时进行迁移。本文要研究的,就是虚拟机的在线迁移。更多详细内容,请参考虚拟机迁移技术漫谈,第 1 部分

2. 迁移相关命令

本文研究的是OpenStack集群中的虚拟机迁移,那么先研究一下OpenStack的虚拟机迁移命令。主要参考Live-migrate instancesBlock Live Migration in OpenStack environment

1、查看实例ID
openstack server list

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的配置试试。

3. nova配置

因为是使用kolla部署的OpenStack,所以修改配置重启服务的方法,和传统方法有所不同。参考kolla(Ocata)部署nova组件关键配置和volume映射Openstack 之 调整nova相关参数。可以知道,主机中的/etc/kolla/nova-compute/nova.conf,对应容器中的/etc/nova/nova.conf。修改后重启容器,nova-compute服务配置就会发生改变。

1、在两个计算节点,修改nova.conf
vim /etc/kolla/nova-compute/nova.conf,添加:

1
live_migration_flag=VIR_MIGRATE_UNDEFINE_SOURCE,VIR_MIGRATE_PEER2PEER,VIR_MIGRATE_LIVE

2、重启nova-compute

1
2
docker stop nova_compute
docker start nova_compute

3、进入容器
docker exec -it nova_compute /bin/bash

4、查看配置是否生效
vi /etc/nova/nova.conf

4. 再次迁移

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的配置。

5. libvirt配置

参考OpenStack虚拟机冷迁移与热迁移虚拟机在 OpenStack 里没有共享存储条件下的在线迁移虚拟化之KVM virsh常用命令篇,对libvirt的配置进行修改。

1、查看libvirtd.conf
vim /etc/kolla/nova-libvirt/libvirtd.conf
修改配置如下:

1
2
3
4
5
6
7
listen_tcp = 1
listen_tls = 0
auth_tcp = "none"
ca_file = ""
log_level = 3
log_outputs = "3:file:/var/log/kolla/libvirt/libvirtd.log"
listen_addr = "0.0.0.0"

2、重启libvirt服务

1
2
docker stop nova_libvirt
docker start nova_libvirt

3、查看libvirt服务
netstat -anpt | grep libvirt
看到libvirtd监听在0.0.0.0:16509端口即为正常。

PS:可以在其他节点使用virsh命令测试连通性
virsh -c qemu+tcp://compute2/system

6. 第三次迁移

1、在控制节点执行迁移命令
nova live-migration --block-migrate 180617ec-1348-4144-a496-8751d12e84bf compute2

2、查看实例详情
openstack server show demo1

迁移成功了,nice。

7. 其他命令

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

8. 后记

以上,实现了OpenStack虚拟机的block live migration。后续实验,不妨再研究下共享存储的live migration。

9. 书签

OpenStack命令行操作之虚机管理实现

虚拟机迁移之热迁移(live_migrate)源码解读