所谓跨平台迁移,对于了解openstack冷迁移过程的同学来说,其实就是手动去执行冷迁移的代码行为,当然像我这种抵制体力劳动的人,肯定会想写脚本去跑,即使不会也要边学边用。
迁移并非想象的简单,原因大概有几点:
1.网络的迁移,浮动ip的迁移;
2.虚机数量众多,光传输数据就是几十个T,而且得保持虚拟机所有信息不能有一点错误;
3.虚机类型多,类型包括本地虚机、卷虚机、以及原本是卷虚机的本地虚机,都没有尝试过方案是否可行;
4.I版镜像和K版使用的镜像差异较大,I版有些很老的镜像还没有用cloudinit去配置虚机信息。
 
一台虚机的迁移过程
前提:
①.K版环境搭建完成、并且关闭config-drive和metadata server。
//因为cloudinit如果检查到虚机的uuid变了会重新去读metadata信息,这样会改变原虚机的密码。
//这里后面我会总结下,如果再让我做一次,我不会做这一步,带来了太多的问题。
②在K版环境中,为老的虚机创建同样的租户用户、镜像、flavor、安全组和网络等信息。
这里虽然一句话,但是工作量很大,涉及大量的虚机资源,而且需要与前端同步。
 
1.对于老的虚拟机,得保证虚机中网卡信息已删除
rm -f /etc/udev/rules.d/-persistent-net.rules
//这一步的目的是保证新的虚机中不带原虚机网卡信息,不然新的虚机网卡eth0起不来。
 
2.将I版环境中的虚机关机
nova stop uuid
 //注意需要确认已经关机
 
3.登录到I版虚机所在的计算节点
3.1将数据拷贝K版环境中
首先你得查到虚机的计算节点,然后才知道怎么去找数据。
[root@node-63~]# scp -r /var/lib/nova/instances/5e8d5d06-e3ed-4f56-b28b-7d57309e9fbb node-76:/tmp/
 
对于卷虚机或者说是原来是卷虚机的本地虚机,它的disk是raw格式的
两种方法解决:①修改libvirt.xml文件中的disk的文件格式
②使用qemu转换raw到qcow2,显然这种更合适,原因raw是空洞文件很大,而qcow2是增量的。
qemu-img convert -f raw disk -O qcow2  disk 
 
3.2将vm的对应的backing-file拷贝到K版环境(我认为这一步其实可以不用做)。
#卷虚机没有backing-file;本地虚机新老虚机如果镜像不一样需要才做这一步。
[root@node-63~]# qemu-img info /var/lib/nova/instances/5e8d5d06-e3ed-4f56-b28b-7d57309e9fbb/disk
image:/var/lib/nova/instances/5e8d5d06-e3ed-4f56-b28b-7d57309e9fbb/disk
file format: qcow2
virtual size:50G(53687091200 bytes)
disk size:734M
cluster_size:65536
backing file:/var/lib/nova/instances/_base/c631b3cc0e8ed9b5fa4d9020995b108d50ba085f
Format specific information:
compat:1.1
lazy refcounts:false

  

[root@node-~]# scp /var/lib/nova/instances/_base/c631b3cc0e8ed9b5fa4d9020995b108d50ba085f node-:/tmp/5e8d5d06-e3ed-4f56-b28b-7d57309e9fbb/
4.开始迁移
  1. source /root/openrc-xxx 
//这个我在迁移开始前,把所有的用户的环境变量都写好了,所以直接用。
4.1 创建一台和I版规格一模一样的虚拟机
nova boot <instance-name>--image <image-uuid>--flavor <flavor-id>--nic net-id=<net-uuid>,v4-fixed-ip=<fixed-ip>--security-groups
<security-groups_id> --available-zone nova:hostname

注意:

1)instance-name 需要很原来的虚拟机名称保持一致

2)image-uuid,已经在K版环境上传了I版镜像,可以直接使用:

有些镜像无法使用,创建这些镜像的虚拟机时,请用任意其他镜像代替

3)flavor,选择和以前的flavor内容一致的模板

4)net-uuid,请选择正确的网络

5)v4-fixed-ip,填写正确的ip地址,和老系统保持ip一致

6)--security-groups,填写正确的安全组

7)--available-zone ,事先规划好的目标计算节点

再次注意:

创建虚拟机时,需要使用特定租户创建,而不是用admin创建。

 
4.2. 待虚拟机启动成功后, 将其关闭
nova stop 41c0cc46-8afd--877b-45310f2a80b2
 
4.3登陆到K版计算结点
1. 替换vm的disk
mv /var/lib/nova/instances/5e8d5d06-e3ed-4f56-b28b-7d57309e9fbb/disk /var/lib/nova/instances/<new-vm-uuid>/
 
注意disk的权限, 自己调整下
 
2. 对于新老虚机镜像用的不一致的要做此步骤。
mv /var/lib/nova/instances/5e8d5d06-e3ed-4f56-b28b-7d57309e9fbb/c631b3cc0e8ed9b5fa4d9020995b108d50ba085f /var/lib/nova/instances/_base/
注意c631b3cc0e8ed9b5fa4d9020995b108d50ba085f 的权限
 
5.登陆K版环境控制节点开机
nova start xxxx
至此、虚机数据迁移部分其实基本完成
 
6.单个浮动ip从I版迁移K版
//因为分批停机,所以没法将整个公网ip一下子迁移过去。
 
7.把新的虚机信息以及网络信息给前端,同步到前端数据库
 
8.当所有虚拟机都迁移完成后,打开config driver
问题来了,当虚机重启后,cloudinit发现虚机的uuid相对于老环境变化了,它会去重新检查metadata信息,因此会导致虚机的原始密码被修改掉,问题既然发生了,就得想办法解决。于是就把虚机的cloudinit开机不自启动。
centos  使用chkconfig去关掉,Ubuntu我没找到办法去关闭自启动方法,于是就暴力删除了加个参数--purge。
还有种老镜像把rc.local的脚本删掉即可。
 
测试结果:

1. 是否能够正常启动,重启,读写数据。

2.虚机所有信息保持与原虚机一致,包括登录密码。

3.网络可达东西南北流量正常,浮动ip可以访问。

 
总结:因为是第一次做这样的跨平台迁移,所以实施的过程其实有不少可以改进的地方。
1.configdrive的问题
当初考虑关闭的原因是,并不知道可以拿到所有用户虚机密码。
如果知道,那就简单了,直接在新建虚机的时候,用userdata传密码进去就行了,这样省去了开关configdrive
以及修改cloudinit服务,风险会少很多。
2、scp传输会导致断点重传
这个可以使用rsync同步工具去传,支持断点续传。
3.部分虚机没有关机传输数据,导致了部分虚机文件系统无法正常启动。
 
附录
#分几个脚本的原因是,一部分工作在白天一部分在晚上进行。
1.传输虚机数据
#!/bin/bash
#:vm uuid
#:dest host
#copy instance file to remote host
set-e
if[ $# -ne ];then
echo "please inpute two parment 1:uuid and 2:dest hostip"
exit
fi
source openrc-zmg.sh
echo vm-uuid:$
echo remotehostip: $
status=`nova show $|grep "^| status"|cut -f -d "|"|sed 's/ //g'`
if["$status"="ACTIVE"];then
echo "please use [nova stop uuid] to shutoff the vm"
exit
fi
nova show $
sourcehost=`nova show $|grep "OS-EXT-SRV-ATTR:host"|cut -f -d "|"`
echo sourcehost:$sourcehost
diskfile=/var/lib/nova/instances/$
echo $diskfile
#ssh $sourcehost "sshpass -p qwe123 scp -r /var/lib/nova/instances/$1 $2:/tmp"
#echo diskfile copy complete
#sleep
#ls
#ssh $sourcehost qemu-img info /var/lib/nova/instances/"$1"/disk|grep backing|cut -d : -f |tr -d '\r'|xargs -i cp -r {} /tmp
#sleep
expect <<!
set timeout -
spawn ssh $sourcehost
expect "root@node"
send "sshpass -p qwe123 rsync -arv --progress /var/lib/nova/instances/$1 $2:/var/lib/nova/instances/tmp\r"
expect "~]#"
send "qemu-img info /var/lib/nova/instances/$1/disk|grep back|cut -d : -f 2|xargs -i sshpass -p qwe123 scp {} $2:/var/lib/nova/instances/tmp/$1\r"
expect "~]#"
send "echo copy competed!\r"
expect eof
!
2.根据execl信息,批量创建
xargs -n7  ./create-vm.sh <test
create-vm.sh

#!/bin/bash
set-e
if[ $# -ne ];then
echo -e "please input parament\n1:<instance-name>\n2:<image-uuid>\n3:<flavor-id>\n4:<net-uuid>\n5:<fixed-ip>\n6:<security-groups_id>\n7:hostname"
exit
fi
nova boot "$1"--image $ --flavor $ --nic net-id=$,v4-fixed-ip=$ --security-groups $ --availability-zone nova:$
sleep
uuid=`nova show "$1"|grep "^| id"|cut -f -d "|"`
nova show "$1"
 
3替换数据
#!/bin/bash
set-e
if[ $# -ne ];then
echo "please inpute two parment 1:new vm uuid and 2:old vm uuid"
exit
fi
status=`nova show $|grep "^| status"|cut -f -d "|"|sed 's/ //g'`
echo $status
if["$status"="ACTIVE"];then
echo "please use [nova stop uuid] to shutoff the vm"
exit
fi
source admin-tenant.sh
nova show $
host=`nova show $|grep "OS-EXT-SRV-ATTR:host"|cut -f -d "|"`
echo "=====VM is at:$host=============="
ssh $host mv /var/lib/nova/instances/tmp/$/disk /var/lib/nova/instances/$/
echo "========mv disk compelted===="
sleep
echo "=====check the disk time for change======== "
ssh $host ls -al /var/lib/nova/instances/$/disk
echo "disk change ok!"
sleep
nova start $
echo "========start vm==wait 30s======"
nova show $
sleep
echo "=======create 0M disk.config======="
ssh $host qemu-img create /var/lib/nova/instances/$/disk.config 0M;
ssh $host chown nova:nova /var/lib/nova/instances/$/disk.config;
echo "======check disk.config owner====== "
ssh $host ls -al /var/lib/nova/instances/$/disk.config

跨平台(I版到K版)迁移实践总结的更多相关文章

  1. VPGAME 的 Kubernetes 迁移实践

    作者 | 伍冲斌  VPGAME 运维开发工程师 导读:VPGAME 是集赛事运营.媒体资讯.大数据分析.玩家社群.游戏周边等为一体的综合电竞服务平台.总部位于中国杭州,在上海和美国西雅图分别设立了电 ...

  2. VPGAME的Kubernetes迁移实践

    VPGAME 是集赛事运营.媒体资讯.大数据分析.玩家社群.游戏周边等为一体的综合电竞服务平台.总部位于中国杭州,在上海和美国西雅图分别设立了电竞大数据研发中心和 AI 研发中心.本文将讲述 VPGA ...

  3. HTML5与CSS3基础教程(第8版) PDF扫描版​

    <HTML5与CSS3基础教程(第8版)>自第1版至今,一直是讲解HTML和CSS入门知识的经典畅销书,全面系统地阐述HTML5和CSS3基础知识以及实际运用技术,通过大量实例深入浅出地分 ...

  4. c++学习书籍推荐《清华大学计算机系列教材:数据结构(C++语言版)(第3版)》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <清华大学计算机系列教材:数据结构(C++语言版)(第3版)>习题解析涵盖验证型.拓展型.反思型.实践型和研究型习题,总计290余道大题.525道 ...

  5. Windows Server 2008 R2 官方简体中文免费企业版/标准版/数据中心版

    Windows Server 2008 R2是一款微软发布的Windows服务器操作系统,和之前发布的Windows Server 2008相比功能更为完善运行更为稳定,提升了系统管理弹性.虚拟化.网 ...

  6. 如何做系列(4)-微博URL短网址生成算法原理(java版、php版实现实例)

    短网址(Short URL),顾名思义就是在形式上比较短的网址.通常用的是asp或者php转向,在Web 2.0的今天,不得不说,这是一个潮流.目前已经有许多类似服务,借助短网址您可以用简短的网址替代 ...

  7. camunda开源版与商业版的差异

    Camunda流程引擎分社区版和企业版,社区版实际上是开源版,是Apache2.0协议,企业版实际上是商业收费版本,需要购买授权才能使用,那么社区版和企业版的差异有哪些呢,社区版本是否能满足我们日常的 ...

  8. 微软发布 Windows Server 2016 预览版第三版,开发者要重点关注Nano Server

    微软已经发布 Windows Server 2016 和 System Center 2016 第三个技术预览版,已经提供下载.Windows Server 2016 技术预览版第三版也是首个包括了容 ...

  9. 使用VNET-to-VNET连接Microsoft Azure国际版和中国版

    Microsoft Azure的VNET-to-VNET功能可以实现跨虚拟网络的VPN连接,通过VNET-to-VNET互联的两个虚拟网络可以在同一个订阅下或者隶属不同的订阅,而且可以跨数据中心.这实 ...

随机推荐

  1. AngularJS---Unknown provider: $routeProvider

    AngularJS路由报错: Unknown provider: $routeProvider 根据先知们的指引,在网上爬贴,有翻到官方的解决文章. 原来在AgularJS1.2.0及其之后的版本中, ...

  2. svn hooks使用

    最近要将某个目录做samba共享出去,而想通过svn同步文档到svn,然后通过svn hooks 同步到共享目录,实现自动化 现在svn服务器和samba server再同一台机器上: 在svn路径下 ...

  3. JS 正则 钱

    function ValidateIsDecial(sValue) { return (!sValue && !!!sValue && /^[0-9]{1,10}(\. ...

  4. OpenCV 3.1

    http://www.tuicool.com/articles/FRfMni2 http://docs.opencv.org/3.1.0/d7/d9f/tutorial_linux_install.h ...

  5. Android应用架构之MVP---&gt;天气实例

    我们知道.Android App 本质上抽象成两个层次:视图和数据.为了App在发展过程中高速的适应变化,方便维护和高速迭代,我们要将数据和视图解耦,而在解藕方面我们的前辈们在漫长的软件开发经验中为我 ...

  6. MBA人物俞洪敏:亿万富翁的生活表

    我的智商非常一般,就是比别人勤奋.我的脑袋不属于特别笨的那种,但肯定也不是顶尖聪明的类型.在北大的50个同学当中,我的智商应该属于中下水平,这说明我不是顶尖高智商. 我的勤奋一般人跟不上.我平均每天工 ...

  7. [译]GLUT教程 - 动画

    Lighthouse3d.com >> GLUT Tutorial >> Basics >> Animation 前面章节我们已经创建了一个白色三角形的窗体.还没到 ...

  8. 对LCD接口的认识

    LCD接口类型: 1.首先我们以传递的信号类型来区分主要有两大类:- 模拟信号: - VGA: Video Graphics Array- 数字信号 - TTL: Transistor Transis ...

  9. 《TomCat与Java Web开发技术详解》(第二版) 第一章节的学习总结--HTTP组成+基本访问方式

    1.需要看懂HTML文件中的组成元素的基本含义.不同的组成元素,可以使得HTML支持文本,图片(img,将图片发给客户端),静态音频/视频(embed src,将音频视频发给客户端),超链接(href ...

  10. Google Code Jam 2014 资格赛:Problem B. Cookie Clicker Alpha

    Introduction Cookie Clicker is a Javascript game by Orteil, where players click on a picture of a gi ...