|
|
楼主 |
发表于 2021-9-10 16:49:47
|
显示全部楼层
热迁移/ _0 T6 j2 Z- P0 s- i
2 [% o4 k9 T; V/ i/ A. _, V热迁移(Live Migration,又叫动态迁移、实时迁移),即虚拟机保存/恢复(Save/Restore):将整个虚拟机的运行状态完整保存下来,同时可以快速的恢复到原有硬件平台甚至是不同硬件平台上。恢复以后,虚拟机仍旧平滑运行,用户不会察觉到任何差异。9 w" `1 Z* O. u4 M0 ~
: [- O4 H; P8 G3 D1 D$ T. q2 U
openstack热迁移* w% ^) o3 j3 z
4 n1 ]' J+ r" ]/ L' L7 F$ bOpenStack有两种在线迁移类型:live migration和block migration。Livemigration需要实例保存在NFS共享存储中,这种迁移主要是实例的内存状态的迁移,速度应该会很快。Block migration除了实例内存状态要迁移外,还得迁移磁盘文件,速度会慢些,但是它不要求实例存储在共享文件系统中。
/ Y0 c0 r/ B7 w( J) m: u: x* NFS允许一个系统在网络上与他人共享目录和文件。通过使用NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件。0 J' k5 W3 n5 l b
% l3 B a. e3 C3 Q. I7 W3 @( u% i
7 \3 r* B ]" F. ]0 k7 b2 j
Live Migration 的实现
, E) b) \* i5 M: D) v8 c3 ^" j" I) g8 W0 I C
1.机器:" f2 w7 K7 u4 Z
jovi-controller 是控制节点 192.168.3.103 [ C8 c$ K" [
jovi-compute1 是计算节点 192.168.3.12! @9 H0 [( D! E, I. Z t
jovi-compute3 是计算节点 192.168.3.14
+ |0 u/ O1 W8 ]' G% G实验阶段,为了避免不必要的麻烦,请用命令service ufw stop关闭各个节点的防火墙,同时修改/etc/hosts文件,确定节点之间能互相ping通主机名。利用id nova命令查看下控制节点nova的uid和gid,并记录,在两个计算节点同样利用id nova查看uid和gid是否和控制节点保持一致,如果不一致则利用usermod -u 控制节点的uid nova和gropumod -g 控制节点的gid nova 两条命令进行修改,同时在所有计算节点运行如下命令,保证所有nova相关文件使用新的uid和gid
4 s5 |7 q1 E2 Y8 [4 X- q[root@vmcom1-mn ~]#service nova-api stop
* Q, B/ z/ v% V0 k' p$ z. U[root@vmcom1-mn ~]#service libvirt-bin stop9 K3 S* N0 O9 m5 g6 }) U
[root@vmcom1-mn ~]#find / -uid 106 -exec chown nova {} \; # note the 106 here is the old nova uid before the change
! W' x7 I9 _4 U+ ~[root@vmcom1-mn ~]# find / -gid 107 -exec chgrp nova {} \; #note the 107 here is the old nova uid before the change: [& Y! v$ {* Y7 z7 p: S2 O
[root@vmcom1-mn ~]#service nova-api restart
7 a0 H1 Q2 C, B* x% O! T) ?0 X6 f[root@vmcom1-mn ~]#service libvirt-bin restart$ |4 k6 I9 x- ?0 Z1 E) ~: J
. K' @5 T: B4 U! _2.修改各个节点的nova.conf
+ V6 m% r7 k3 }; x6 ^vncserver_proxyclient_address=本机ip
5 b# O; n# H! ~2 ~* yvncserver_listen=0.0.0.0/ Q5 a( \( }0 P9 D- R
: C( X0 O3 J9 A' S3.控制节点,配置nfs" e( E0 ^1 V- c( r' e& m
5 A: |! s \/ S- Q" n' v
apt-get install nfs-kernel-server portmap! o2 h; s7 S. \( T5 x$ V
在/etc/exports中加入/var/lib/nova/instances *(rw,sync,fsid=0,no_root_squash)1 y! ~* t L- i9 E% y& g/ f
重新启动nfs服务,portmap服务 C- |5 ~! j2 S2 u: n
5 _6 A' d3 c7 [; ]# g
4.计算节点,配置nfs和挂载
, t$ p! z' t" ]
6 D% u# h9 y/ L4 X% X( Papt-get install nfs-common portmap/ _) e5 V9 C, ?
chmod o+x /var/lib/nova/instances,确保节点有执行和查找目录的权限
5 l4 B' @! G1 R7 i& d( D5 V在计算节点的/etc/fstab的目录中加入 ^8 D" v% g$ X! D
控制节点ip:/var/lib/nova/instances /var/lib/nova/instances nfs defaults 0 07 v) P. {- `- L; M8 U" Q
挂载目录,执行8 R( Y5 N- l: |, o
mount -a -v& t9 T7 s/ x$ }
df -k 查看已挂在目录,可以在最后看到远程控制节点的目录已被挂在2 \3 O& h8 b' K4 V0 t
% A& i& R* n1 L
5.修改计算节点的相关的四个配置文件,可以手工如下修改1 ?. ~/ \# O! d) e$ s, W; \
5 ]3 Y7 |# K. g2 o) r/ J( q
附修改脚本:
6 W# p1 _/ v6 ]6 @+ ~+ |) p+ S5 Rsed -i '/vncserver_proxyclient_address/d' /etc/nova/nova.conf; J) W" s7 Y# |1 m( t- W$ A
sed -i '/vncserver_listen/d' /etc/nova/nova.conf
9 B- }3 F5 B/ t R% Wsed -i '$a\vncserver_listen=0.0.0.0' /etc/nova/nova.conf
3 E, U5 X9 ^+ x) @: g" b' Ysed -i 's/#listen_tls = 0/listen_tls = 0/g' /etc/libvirt/libvirtd.conf- G0 |; I% A0 o- g6 i& P
sed -i 's/#listen_tcp = 1/listen_tcp = 1/g' /etc/libvirt/libvirtd.conf3 A' \' G6 h4 @ F1 j ]6 y
sed -i '$a\auth_tcp="none"' /etc/libvirt/libvirtd.conf: n9 n) L2 @1 Z1 I4 g1 V
sed -i 's/env libvirtd_opts="-d "/env libvirtd_opts="-d -l"/g' /etc/init/libvirt-bin.conf
& w/ _/ L, \* `# x! Fsed -i 's/libvirtd_opts=" -d"/libvirtd_opts=" -d -l"/g' /etc/default/libvirt-bin
; w, I+ d( ~# B' H; T+ R4 t$ C" h+ zsed -i 's/#vnc_listen = “0.0.0.0″/vnc_listen = “0.0.0.0″/g' /etc/libvirt/qemu.conf
R p- K' @- E( a( i- a. psed -i 's/#user = "root"/user = "root"/g' /etc/libvirt/qemu.conf4 e- e' I+ e, w: l4 y, W. Y2 }! S- i
sed -i 's/#group = "root"/group = "root"/g' /etc/libvirt/qemu.conf5 I" y2 i2 B$ h9 y0 R
( k$ J$ |. ^, ?( o' j
% j% E# K( z" [& v3 C# q4 p
6.重新启动libvirt-bin1 k0 y$ l( B. L) p3 h
, S1 Z' K5 b" Iservice libvirt-bin restart
I) f& I: Y/ n9 }! _确定进程已启动。
0 {- n+ U2 N8 g- @8 R: Eps -ef | grep libvirt" @, a o! O+ |8 u8 L7 A; }/ M
确定有libvirtd -d -l进程存在3 P7 q. u' V) ]0 t3 Z% h. ]
root 5277 1 004:06 ? 00:00:01/usr/sbin/libvirtd -d -l8 R% Y# P0 @, e8 d. f/ P. {- N
U: E( Z+ h% f5 B' ]7 _7.重新启动nova-compute服务,portmap服务
$ i* F3 \$ c O- Z7 e5 e) t/ ^# r
. {$ k* q2 Y& q7 Cservice nova-compute restart) u, d+ F- N$ B" W
service portmap restart
2 v) R1 ^7 j' s$ q* B
( F9 r$ _- S$ z: A5 ~8.测试
8 l/ l4 |% ?5 f: }9 Q% a
8 U. G* [$ \0 ]) \1 Z$ ^root@jovi-controller:~# nova list 查看实例
_, w6 j$ ^1 Vroot@jovi-controller:~# nova show 11fd9622-a948-4cdb-94d0-d8f2558cf179 查看需要迁移的实例6 p2 }( k, h) v7 _$ p0 @
root@jovi-controller:~# nova-manage service list查看可用的计算节点! h1 T: _/ S( g# `5 P/ j2 E
root@jovi-controller:~# nova-manage service describe_resource compute-node2查看目标节点资源
1 f0 \( i! ?% G1 q: B0 g2 sroot@jovi-controller:~#nova live-migration 11fd9622-a948-4cdb-94d0-d8f2558cf179 jovi-compute3 迁移成功,应该没有输出。
, V" q. R. U# ]5 U+ C9 P$ q7 L, _$ M$ e/ C! O! O
相关问题的总结:
) M6 F, W8 L4 {+ V! u( ]* l8 C1 i" E4 ~9 G1 O+ N* t3 \# Q9 y9 k
部署过程中曾遇到两个导致无法迁移成功的错误,一个是在日志文件中发现cpu info incapable,另外一个问题是在日志文件中发现failed to connect remote host uri,经过与最后实验成功的环境相对照,发现实际上导致这两个问题的最终原因是计算节点的计算资源不匹配,例如之前失败的情况是compute1节点 cpu 4核心,8g内存,compute3节点 cpu 2核心,内存4g,所以提示出现上述错误。
; |* X& i- T n& j: J
! @' L! [! Y. B& B- J" W本质是因为在openstack源码中,有一段针对热迁移时节点计算资源检测的函数,该函数的作用检测迁移的源节点和目的节点的计算资源是否匹配,从而判断能否承载实例的运行。
: P4 l; E. O3 [9 ^, O- S( X) f$ ?9 _% I7 h e
因此后来将两个计算节点都调整为双核,4g内存,按之前方案配置后,即可成功实现迁移。
( M& ~* x2 A7 |0 t% }$ X5 Y( \' z
7 ?3 f8 w' {( N( p# m! m: T" u' ?另外网上的部署方案都提到了要修改nova.conf中vncserver_proxyclient_address=127.0.0.1,笔者经过测试,这这种方法只适用于单网卡的计算节点,多网卡情况下应该注意填写的是与控制节点以及其他计算节点互联网口的ip,这样dashboard中的vnc才可以成功运行,否则会提示faild to connect to server错误。 |
|