KVM虚拟机迁移到openstack Havana的详细方法
最近进行了一次实现,即KVM虚拟机迁移到openstack Havana。
1.系统环境
现有系统是openstack f版,使用的openvswitch插件管理的sdn。今年十月openstack发布了H版,按照策略为了根上openstack的步伐,暂定每年升级一次,但是这次升级出现了问题。f版本的openvswitch插件使用的是长期支持版本1.4.2,系统都是centos6.3。H版的openstack使用的是centos6.4,openvswitch1.11.0.由于迁移需要增加了两台pcserver作为计算节点,一台pc作为控制节点,但是交换机资源有限只能在原系统网络拓扑中增加了这3台机器,为故障埋下了祸根。
过程中具体配置不是本文主题,由于未知影响,看网络抓包应该像是dhcp包影响到openstack f版本的生产系统,导致从早上搭建开始整个系统kernel panic一次,中午一次,晚上一次,十分郁闷等到晚上7点,无论如何起不来了,6台生产系统的HP pcserver DL380G6轮番重启。
2. 从openstack folsom迁移到virt manager。
其实也不算迁移,由于f版的生产系统无论如何起不来,也没有时间研究原因,按计划应该已经搭建完成的h版本系统也没完成,老生产系统也无法恢复。直接原因就是openvswitch1.4.2,开始考虑使用linux bridge,经过2小时研究这时已经晚上10点,发现linux bridge貌似不支持vlan,也就是说,无法使用一个网卡接口实现sdn建立不同网段的虚拟机。压力很大,心口像有一块大石丫的我好累,不知道谁唱的鸟歌。突然想到,f版的openstack管理的生产环境其实只有3个网段,0,1,2,而hp 的pcserver有4个网卡,可以去掉openstack直接使用kvm的manager,一个网卡作为管理口,剩下3个作为0,1,2每个网段的分网卡。就这么干了,马上上楼做网线,调华为交换机,trunk,vlan不是主题不说。弄好环境以后,由于openstack管理的虚拟机也是通过kvm的接口virt管理的,所以虚拟机还是在kvm上,只需要关闭openstack的所有服务,然后再kvm的virtmanager中修改对应虚拟机0,1,2网段的桥接网卡。然后启动虚拟机,修改虚拟机中的网卡,以前openstack管理的eth0卡已经不见了,给eth1手动增加ip,ping一下网关,心中暗喜,大石落地。
3. 搭建openstack Havana
过程不表了,www.openstack.org文档多的是,详细的很。
4. 将kvm管理的虚拟机迁移到H版本的openstack
说了这么多,这才是本文重点。具体步骤如下:
a.备份kvm中的虚拟机成为镜像文件,在计算节点执行
qemu-img convert -f qcow2 -O qcow2 disk newdisk
b.停止虚拟机
c.在计算节点创建nfs将上面打快照的newdisk共享到控制节点,主要要减少大型虚拟机在结算节点和控制节点之前的拷贝,虚拟机一般500g左右。mount好以后,控制节点就会误以为镜像文件已经在自己的控制节点上了,省去了将快照镜像导入glance的步骤。
mount 192.168.0.2:/home/share/newdisk on /openstack/lib/glance/images
d.修改openstackHavana版本的数据库,修改数据库后,在havana版上新建虚拟机时才能在页面和openstack真正使用刚才假冒导入glance的虚拟机快照。细心同事写的脚本。在控制节点执行。
#!/bin/sh
iname=$1
filepath1="/tmp/$iname-1.sql"
filepath2="/tmp/$iname-2.sql"
mysql -uroot -phavana@passwd<<EOF
use glance;
load data local infile '$filepath1' into table images(id,name,size,status,is_public,created_at,updated_at,deleted_at,deleted,disk_format,container_format,checksum,owner,min_disk,min_ram,protected);
load data local infile '$filepath2' into table image_locations(image_id,value,created_at,updated_at,deleted_at,deleted,meta_data);
EOF
执行import_mysql.sh 192.168.1.xxx_20131205
inname-1.sql内容:
e340ccc1-dd65-4163-822f-348d5711313f 172.21.0.41_20131205 97956003840 active 0 2013-12-02 18:10:04 2013-12-02 19:36:10 N 0 qcow2 ovf e30b8b94918aad131cf4618a8efc3d78 f3267153b73d4bf09bed91eb289e26ec 0 0 0
inname-2.sql内容:
92b44daf-a529-469d-b428-dca8bc39fe4c file:///openstack/lib/glance/images/92b44daf-a529-469d-b428-dca8bc39fe4c 2013-12-02 17:59:30 2013-12-02 17:59:30 N 0 {}
e.修改计算节点openstack HAVANA代码,由于我们不想让glance把快照传来传去,假装了glance的已经导入的快照,但是glance还是有办法判断,注释下面的代码让glanceclient不再判断。记得注释完pythonc编译一下,然后重启service openstack-nova-compute 服务。
vi /usr/lib/python2.6/site-packages/glanceclient/common/http.py
将501行-504行注释代码
501 #if self._checksum is not None and md5sum != self._checksum:
502 # raise IOError(errno.EPIPE,
503 # 'Corrupted image. Checksum was %s '
504 # 'expected %s' % (md5sum, self._checksum))
f.到这一步,kvm到openstack Havana的快照镜像已经准备好了,只需要在建立虚拟机就可以了。当然具体建网络,subnet和openvswitch的port过程不说了。
5. 验证主机,一切ok,KVM虚拟机迁移到openstack Havana成功。