OpenStack中虚拟机的在线迁移

文章目录
  1. 1. 前言
  2. 2. 迁移相关命令
  3. 3. nova配置
  4. 4. 再次迁移
  5. 5. libvirt配置
  6. 6. 第三次迁移
  7. 7. 其他命令
  8. 8. 后记
  9. 9. 书签

前言

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

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

迁移相关命令

本文研究的是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的配置试试。

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

再次迁移

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.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

第三次迁移

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。

书签

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

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