跨平臺(I版到K版)遷移實踐總結

       所謂跨平臺遷移,對於瞭解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/70-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-63~]# scp /var/lib/nova/instances/_base/c631b3cc0e8ed9b5fa4d9020995b108d50ba085f node-76:/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

注意:前端

1instance-name 須要很原來的虛擬機名稱保持一致node

2image-uuid,已經在K版環境上傳了I版鏡像,能夠直接使用:數據庫

有些鏡像沒法使用,建立這些鏡像的虛擬機時,請用任意其餘鏡像代替centos

3)flavor,選擇和之前的flavor內容一致的模板安全

4)net-uuid,請選擇正確的網絡bash

5)v4-fixed-ip,填寫正確的ip地址,和老系統保持ip一致網絡

6)--security-groups,填寫正確的安全組ssh

7)--available-zone ,事先規劃好的目標計算節點工具

再次注意:測試

建立虛擬機時,須要使用特定租戶建立,而不是用admin建立。

 
4.2. 待虛擬機啓動成功後, 將其關閉
nova stop 41c0cc46-8afd-4333-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服務,風險會少不少。
二、scp傳輸會致使斷點重傳
這個可使用rsync同步工具去傳,支持斷點續傳。
3.部分虛機沒有關機傳輸數據,致使了部分虛機文件系統沒法正常啓動。
 
附錄
#分幾個腳本的緣由是,一部分工做在白天一部分在晚上進行。
1.傳輸虛機數據
#!/bin/bash
#1:vm uuid
#2:dest host
#copy instance file to remote host
set-e
if[ $# -ne 2 ];then 
    echo "please inpute two parment 1:uuid and 2:dest hostip"
    exit
fi
source openrc-zmg.sh
echo vm-uuid:$1
echo remotehostip: $2
status=`nova show $1|grep "^| status"|cut -f 3-d "|"|sed 's/ //g'` 
if["$status"="ACTIVE"];then    
    echo "please use [nova stop uuid] to shutoff the vm"
    exit
fi
nova show $1
sourcehost=`nova show $1|grep "OS-EXT-SRV-ATTR:host"|cut -f 3-d "|"`
echo sourcehost:$sourcehost
diskfile=/var/lib/nova/instances/$1
echo $diskfile
#ssh $sourcehost  "sshpass -p qwe123 scp -r /var/lib/nova/instances/$1 $2:/tmp"
#echo diskfile copy complete
#sleep 5
#ls
#ssh  $sourcehost qemu-img info /var/lib/nova/instances/"$1"/disk|grep backing|cut  -d : -f 2|tr -d '\r'|xargs -i cp -r {}  /tmp     
#sleep 5
expect <<!  
set timeout -1
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 7 ];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 $2 --flavor $3 --nic net-id=$4,v4-fixed-ip=$5  --security-groups $6 --availability-zone nova:$7
sleep  30
uuid=`nova show "$1"|grep "^| id"|cut -f 3-d "|"`  
nova show "$1"
 
3替換數據
#!/bin/bash
set-e
if[ $# -ne 2 ];then
    echo "please inpute two parment 1:new vm uuid and 2:old vm uuid"
    exit
fi
status=`nova show $1|grep "^| status"|cut -f 3-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 $1
host=`nova show $1|grep "OS-EXT-SRV-ATTR:host"|cut -f 3-d "|"`
echo "=====VM is at:$host=============="
ssh $host mv /var/lib/nova/instances/tmp/$2/disk  /var/lib/nova/instances/$1/
echo "========mv disk compelted===="
sleep 3
echo "=====check the disk time for change======== "
ssh $host ls -al /var/lib/nova/instances/$1/disk
echo "disk change ok!"
sleep 10
nova start $1
echo "========start vm==wait 30s======"
nova show $1
sleep 30
echo "=======create 0M disk.config======="
ssh $host qemu-img create /var/lib/nova/instances/$1/disk.config 0M;
ssh $host chown nova:nova /var/lib/nova/instances/$1/disk.config;
echo "======check disk.config owner====== "
ssh $host ls -al /var/lib/nova/instances/$1/disk.config
相關文章
相關標籤/搜索