易陆发现互联网技术论坛

 找回密码
 开始注册
查看: 2339|回复: 3
收起左侧

openstack 疏散功能nova evacuate

[复制链接]
发表于 2021-8-30 17:33:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?开始注册

x
[root@controller1 ~]# nova help  evacuate. l9 l3 n% G8 y$ A- W
usage: nova evacuate [--password <password>] <server> [<host>]3 b) `3 ~- f; R$ F' u
Evacuate server from failed host.$ L1 J- @: ^# u! m1 X
Positional arguments:
! a% n. X! o! \: a# D, @  <server>               Name or ID of server.5 {5 W1 }" \2 _7 A
  <host>                 Name or ID of the target host. If no host is
# X9 ^  q$ ]0 G0 w: Z+ I6 n" b                         specified, the scheduler will choose one.
: Z3 n; q+ ~, Y- l7 A+ a! i5 iOptional arguments:* G* m  B1 q' |& F5 O. `7 b
  --password <password>  Set the provided admin password on the evacuated
' ^5 A9 c8 l' ?! ]1 I  u& g" ^                         server. Not applicable if the server is on shared$ H: u1 T0 l4 Q" p8 m( L, R
                         storage.
2 N/ d+ T. \( g5 r% p
 楼主| 发表于 2021-8-30 17:35:13 | 显示全部楼层
前提条件:
% j# ]% b. ]: L; l, ?, Dopenstack和ceph集成完成,保证虚拟机系统盘运行在ceph上
6 A( g: `9 Q  A& j0 Y
0 m2 c3 E$ T/ H$ L) k0 B配置步骤:
2 r5 q8 z3 ~1 X+ O$ {. I0 r5 g1.在各个计算节点之间做root的ssh认证,可以相互免密登录6 ?5 N* n: D& w6 j3 \: P4 k
/ N1 o+ p- V% [0 T
2.配置libvirtd服务修改配置$ d( F( U; z1 c

" K. ]/ A2 x' v' H# vim /etc/libvirt/libvirtd.conf
" N, M& f0 B' q6 T; _
0 V! G2 g1 B1 B8 x& \: `  u0 Ulisten_tls = 0
8 Y: U2 O; g' J0 J0 P) blisten_tcp = 1
9 M1 w4 W5 Z" c9 h2 U( Y8 }4 sunix_sock_group = "root"5 `3 P6 ^' H% n# }/ c0 b
unix_sock_rw_perms = "0777"9 M3 h; _: {7 F; X5 z
auth_unix_ro = "none"* q2 o0 \* Z1 q6 b( k
auth_unix_rw = "none"1 f1 P0 Z) Y8 u7 ]- w. j
log_filters="2:qemu_monitor_json 2:qemu_driver": _  M6 g0 G' C2 t8 N" z+ ]+ m- a) e3 s
log_outputs="2:file:/var/log/libvirt/libvirtd.log"
1 Y% s9 u- f3 q8 k/ s* ^tcp_port = "16509"( t# M. F4 j3 o: q& O
listen_addr = "0.0.0.0"9 w# z( ~5 ^* a# ^& Z: |7 |- m
auth_tcp = "none"
& m% ]. a! u+ d( m修改配置$ x4 z7 Q. m9 }+ t4 q
2 s; Z7 W, c- g  g% V
vim /etc/sysconfig/libvirtd
. k6 I" y: O5 D+ m! j2 D% S ; U* g! e2 U7 t  |
LIBVIRTD_ARGS="--listen") H$ e. A+ J* m" Q6 w- o
#重启libvirtd服务$ j* J. o' C# {* p; F2 e0 f
  Z2 h5 R) Z9 P& C3 T8 ^4 r4 ~; U
# systemctl restart libvirtd
3 V/ u" w6 N4 n( P! }3.执行热迁移
  j! W* B8 w" j1 S: `& ?; C! w6 E; L) W6 b1 m7 f
# openstack server migrate 3aa7f750-0867-43e8-accb-d2262ab99932 --live compute01
) v* E# v" V9 O4 n& E' u4.疏散步骤
3 Q/ S3 \+ U( g7 Y5 Q2 ~* \4.1 主机查询) o9 K  |& h, ]5 |; I7 V$ B* D) q

+ R6 f2 l: V; I! g0 H; g6 l% `# openstack host list
2 D( l' r# ?6 @- k, l5 y[root@controller1 ~]# openstack host list 9 O4 }1 l! X" L9 @. F. \. s, p( M
+-------------+-------------+----------++ E' g7 X+ g" N* B: n. Y  v( F$ e
| Host Name   | Service     | Zone     |
7 t7 |9 [8 s( c, d) ^+-------------+-------------+----------+0 I: A2 i- r4 @: Q& c- [
| controller2 | scheduler   | internal |; U0 o/ o. B. o9 w- p; B: ], S) l' l* U
| controller3 | scheduler   | internal |8 z: }  E2 I6 l  F: v/ b
| controller1 | scheduler   | internal |
1 W/ W" {0 N. q: U# s; l$ Z| controller3 | conductor   | internal |0 x8 S2 F9 `# Z8 I. u( Z
| controller1 | conductor   | internal |
/ N6 ?; b2 v1 y0 L5 s0 ]" x- J| controller2 | conductor   | internal |
9 {0 w8 G. B& g| controller2 | consoleauth | internal |' ?) b9 n4 X8 p
| controller1 | consoleauth | internal |+ L" w2 X/ y: H- K0 C
| controller3 | consoleauth | internal |# f; r# d. ~3 x/ o
| compute02   | compute     | nova     |+ `" r; _  m, `% H8 A/ W) T; l
| compute03   | compute     | nova     |
) u/ Y6 m. J- {| compute01   | compute     | nova     |
5 w+ c+ w- U3 _, Y) z$ ?5 G+-------------+-------------+----------+
1 I1 c- C$ W; d& t! c
% k: _+ x/ ^3 l2 x4 ?: S4 a7 v$ d; [9 ~# y
4.2 执行疏散
# v/ K& K% ~0 R8 q. Y. }$ ~! n/ k- c! @/ u
一台计算节点的所有虚拟机疏散到另外一台计算节点
: |* f4 S5 t' d0 Z7 d/ u; j
8 X. S# {$ Q9 {. S4 G9 K* i( q9 M( e+ G0 V2 |6 ?5 v

$ n: ^+ G$ i9 f4 X5 j1 j8 Z0 P# nova host-evacuate --target_host compute02 compute01
4 G1 j3 }9 }- d" p. n$ N一台计算节点上的一台虚拟机疏散到另外一台计算节点# W1 `/ @1 S# C# t. u
: d7 w& c8 ^$ }1 I$ J; C( Q
# nova evacuate 3aa7f750-0867-43e8-accb-d2262ab99932 compute025 m/ |% T$ |: ?3 |* H$ U' u
" G- J1 I& u0 U. H
& w% t. [. ~% @+ P  e" t' Q
[root@controller1 ~]# openstack host list $ _1 L) P9 D! f9 p7 e$ N- x
+-------------+-------------+----------+
  S: d7 t9 p5 Z' w1 Y| Host Name   | Service     | Zone     |
6 L/ D1 r7 |* a5 ^* M/ u$ M) C+-------------+-------------+----------+
" R' N4 |! t, M# ]( _- H| controller2 | scheduler   | internal |: \/ I1 C* ~- {1 Z' i4 u
| controller3 | scheduler   | internal |9 s3 A6 @- x+ v: Y! b/ ~7 A
| controller1 | scheduler   | internal |
5 L2 ?& P5 G1 v3 C" d) d+ m| controller3 | conductor   | internal |4 o; J9 w. |7 x& E
| controller1 | conductor   | internal |
0 O  s, x, R* }| controller2 | conductor   | internal |
  Q. Z, s5 H$ I| controller2 | consoleauth | internal |* q* u: V! H5 b! I
| controller1 | consoleauth | internal |, I: z/ |  X7 u* J! R
| controller3 | consoleauth | internal |
( h2 p/ p5 C- y! F; H| compute03   | compute     | nova     |
' D: J8 _9 q+ v| compute01   | compute     | nova     |
3 U8 w5 ?+ [3 ~) E+ D# C+-------------+-------------+----------+6 m' L  D$ J9 }6 F7 m% O# K  x

' {* [+ ~+ T8 E+ N' Z; {; D1 S; k[root@controller1 ~]# nova host-evacuate --target_host compute02 compute01, l" n9 d5 x' B2 @  I+ U
+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
* z/ ^1 }1 F3 o| Server UUID                          | Evacuate Accepted | Error Message                                                                                                                                    |, u/ l! s" K: n# q. U& l& j& [
+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+2 N' m. B5 y2 ]" P. {
| 590e3822-085b-4273-bce1-bf0e7a09b9f7 | False             | Error while evacuating instance: Compute service of compute01 is still in use. (HTTP 400) (Request-ID: req-a53b7625-8718-4fe9-9c90-ba67bc79c5bb) |
, X# T5 s* X% f% X: ^7 D! F+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+! E5 R# I: d2 A5 D5 V
[root@controller1 ~]# nova host-evacuate --target_host compute02 compute03
: H* i' x6 F# M6 f- G+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
- j9 c& ?/ v- |! E1 Q| Server UUID                          | Evacuate Accepted | Error Message                                                                                                                                    |
0 l+ k' q! V" R3 ~% z& j  B/ `4 F- D+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+, J% z' F0 H7 J8 e) ^: c
| 347d5d2e-1516-41ef-b247-a42bc72e093c | False             | Error while evacuating instance: Compute service of compute03 is still in use. (HTTP 400) (Request-ID: req-d6940859-0d1f-4453-b6b7-16091b602b39) |) z; D7 |7 U% m
+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
+ x, u. n6 q4 @6 ?: j( H# `* o* N
% d' v& g# H/ Z" E% n; \. K* j[root@controller1 ~]# nova list $ M. z$ n6 s, S0 O' [! ~
+--------------------------------------+----------+--------+------------+-------------+-------------------------------------+7 x# g2 c& H9 t6 c
| ID                                   | Name     | Status | Task State | Power State | Networks                            |
  m. w% P& w, T9 }! y, O- h+--------------------------------------+----------+--------+------------+-------------+-------------------------------------+" x! E0 v8 \% y& ?; n
| 7b01d71a-40d4-45fa-bf5c-97e676b2b9a2 | test1    | ACTIVE | -          | Running     | bridge=192.168.0.206, 192.168.0.233 |
7 X9 z0 L5 n, a; [+ K| 590e3822-085b-4273-bce1-bf0e7a09b9f7 | zhangyj1 | ACTIVE | -          | Running     | bridge=192.168.0.223                |
: [2 S  o4 ~% U; j) V& O| 347d5d2e-1516-41ef-b247-a42bc72e093c | zhangyj2 | ACTIVE | -          | Running     | bridge=192.168.0.201                |9 I7 ^! M" M, |4 B7 T
+--------------------------------------+----------+--------+------------+-------------+-------------------------------------+
0 G; [1 }7 n! C. I$ Y# l9 T[root@controller1 ~]# nova evacuate  7b01d71a-40d4-45fa-bf5c-97e676b2b9a2 compute03
! }2 j" _8 I" U2 D+ b8 D3 C: Z- Z2 D6 [[root@controller1 ~]# nova list
+ S9 }/ _; P) z) v& B/ x+--------------------------------------+----------+--------+------------+-------------+-------------------------------------+
- g& l8 S; |$ E$ H5 T+ L- c| ID                                   | Name     | Status | Task State | Power State | Networks                            |1 C; n1 A% h2 L) X
+--------------------------------------+----------+--------+------------+-------------+-------------------------------------++ [7 O- B6 V; ]" v
| 7b01d71a-40d4-45fa-bf5c-97e676b2b9a2 | test1    | ACTIVE | -          | Running     | bridge=192.168.0.206, 192.168.0.233 |
& h# Z9 ]+ \, L% i8 n; h# b! g| 590e3822-085b-4273-bce1-bf0e7a09b9f7 | zhangyj1 | ACTIVE | -          | Running     | bridge=192.168.0.223                |
; W! E% F: ~0 d- `+ f| 347d5d2e-1516-41ef-b247-a42bc72e093c | zhangyj2 | ACTIVE | -          | Running     | bridge=192.168.0.201                |; ^# M3 S7 B9 k/ H+ \- r" H3 [
+--------------------------------------+----------+--------+------------+-------------+-------------------------------------++ [1 g7 E5 I& A7 o- m: A$ s
[root@controller1 ~]# nova show 7b01d71a-40d4-45fa-bf5c-97e676b2b9a2
6 l1 N+ N0 {/ l) j1 Z# `+--------------------------------------+----------------------------------------------------------------------------------+
8 Z: P) h9 u' M1 O) p& [/ y| Property                             | Value                                                                            |
, D( c) ~6 v( f7 f3 S3 ^" s% @+--------------------------------------+----------------------------------------------------------------------------------+' Z5 x: {3 ?3 o6 p' |: |+ J2 m
| OS-DCF:diskConfig                    | AUTO                                                                             |2 c2 ~8 S' I# }' M& q9 g* [/ a9 D( T
| OS-EXT-AZ:availability_zone          | nova                                                                             |
& Q- c& w. ~. B4 Y| OS-EXT-SRV-ATTR:host                 | compute03                                                                        |
# i: E2 `/ z- ]7 k% {( ?| OS-EXT-SRV-ATTR:hostname             | test1                                                                            |
! g- [+ f, ~% g+ b' o9 c| OS-EXT-SRV-ATTR:hypervisor_hostname  | compute03                                                                        |8 R, P( j2 s. ]: \1 V
| OS-EXT-SRV-ATTR:instance_name        | instance-00000002                                                                |) l% Z; I9 Y1 |& e. g
| OS-EXT-SRV-ATTR:kernel_id            |                                                                                  |# L0 l# |0 b" Y8 p& ]0 V
| OS-EXT-SRV-ATTR:launch_index         | 0                                                                                |$ a" K! n( c5 [0 x+ o* ]; _
| OS-EXT-SRV-ATTR:ramdisk_id           |                                                                                  |- V6 T* o& a  V$ _: n4 c4 a" |1 n
| OS-EXT-SRV-ATTR:reservation_id       | r-uqofhf0v                                                                       |
! \  o5 W' a; S, e7 e| OS-EXT-SRV-ATTR:root_device_name     | /dev/vda                                                                         |$ S5 w2 Q: W8 X& o, \
| OS-EXT-SRV-ATTR:user_data            | -                                                                                |
- @8 Q  |2 i2 @6 Z5 D  Z' y| OS-EXT-STS:power_state               | 1                                                                                |
; U4 x; w( ]& i/ L4 I& D| OS-EXT-STS:task_state                | -                                                                                |: J( ~* R$ a- G; A' h. d
| OS-EXT-STS:vm_state                  | active                                                                           |
: T9 e* @6 P" X9 `& W5 w| OS-SRV-USG:launched_at               | 2021-08-31T01:25:16.000000                                                       |' z) j+ n# i& f
| OS-SRV-USG:terminated_at             | -                                                                                |, A( v( L' ~! H0 z& c' @& p5 M
| accessIPv4                           |                                                                                  |& ^1 u+ j! j; M, a/ U8 Y0 `) X& f
| accessIPv6                           |                                                                                  |6 d& r# U% m$ G$ V0 q: L2 |
| bridge network                       | 192.168.0.206, 192.168.0.233                                                     |' ^6 T6 M6 n. T! l; J2 Q
| config_drive                         |                                                                                  |
: {: @. A% U- b- r3 I| created                              | 2021-08-25T07:37:43Z                                                             |/ j0 @" B" u; L
| description                          | -                                                                                |
; [" t' B: f; D0 @! \| flavor:disk                          | 10                                                                               |
: P( ^3 F9 t) `( s$ R4 J$ l& m. U/ V| flavor:ephemeral                     | 0                                                                                |( o+ r1 ]1 }' w: |* N) b
| flavor:extra_specs                   | {}                                                                               |* i( S  R0 F) `9 _5 D& ?
| flavor:original_name                 | type-1c-1g-10g                                                                   |* Q& D  V' l* |" y# y
| flavor:ram                           | 1024                                                                             |0 _9 T) o% l4 d: h( }% O
| flavor:swap                          | 0                                                                                |
- C( V9 x) C+ s  Z: Z2 C( n8 x| flavor:vcpus                         | 1                                                                                |
: n' f: o$ q6 X3 W/ z1 k7 a5 d+ q| hostId                               | 35bcc54020d6ae54aebe586983a9df9d8562a0201cea0c0d85e39455                         |
0 V( _$ f" W+ T* h/ |( L  i* V: d| host_status                          | UP                                                                               |2 Z" k& T2 H. W# s3 v% l
| id                                   | 7b01d71a-40d4-45fa-bf5c-97e676b2b9a2                                             |) q' s, A; V; @+ O" B
| image                                | Attempt to boot from volume - no image supplied                                  |
1 B5 y7 ?9 J  ~* v| key_name                             | -                                                                                |
& Q4 U" t- D4 o/ u2 ^# F| locked                               | False                                                                            |
; S) S% }8 x7 M( a, Q| metadata                             | {}                                                                               |
+ j, D4 a0 R9 j2 j+ e| name                                 | test1                                                                            |
- m& y5 J% d; e; || os-extended-volumes:volumes_attached | [{"id": "d385a405-529b-450e-98e7-44aad0d3e94a", "delete_on_termination": false}] |* i) {- m! |' V. A
| progress                             | 0                                                                                |
! j! V( j; I, H1 o/ d5 x; B* p| security_groups                      | default                                                                          |1 Q5 D0 H6 @) P1 T5 \" i6 z
| status                               | ACTIVE                                                                           |
0 J3 }/ T8 N4 [5 e2 {; A# S" d" o| tags                                 | []                                                                               |
- z$ X  M  j, o6 B( t0 l* j| tenant_id                            | 92a5a26fc14d418d881ade0ccbcffc59                                                 |( Z7 Y6 N; d9 G7 F+ l
| updated                              | 2021-08-31T01:25:17Z                                                             |
6 o% {, d" O2 m& a1 m* x9 F| user_id                              | b1ffbc1f84cf42c99a8e59fdaf7f1cf5                                                 |  d* h# M2 v1 |! z" W
+--------------------------------------+----------------------------------------------------------------------------------+6 V) _1 \2 k3 f. h; ^5 ~& M1 m+ e: e) l
————————————————- z* n# o$ R2 g# }- @! B5 C
6 J. v" Y" u0 i9 g, `5 |: @2 u2 r
& b9 `% Z5 `8 y! H% I5 [
 楼主| 发表于 2021-8-30 17:35:43 | 显示全部楼层
一. 当实例所在的节点发生故障不可用时,可执行evacuate操作,在另外一个新节点rebuild该实例,实现高可用。( r- b. h4 y8 w+ C% O( v
这可以是OpenStack计算节点HA的一种实现方案。; T3 P! f6 }$ w  B2 K( a4 S

3 v$ E2 y1 e% k4 R, ^二. API调用
' x7 W2 _6 }; w6 t- p3 Tnova.servers.evacuate(server=fm['id']), on_shared_storage=True
" O& n  x4 P( G) n9 Y% A1. on_shared_storage参数在2.14版本后废除,自动检查是否为共享存储。
5 n% M! P  }8 |; B    共享存储能够保证实例在另外新节点重建后数据不丢失
7 _9 C% `$ B. w) w2. 可以设置目的主机host
* W( C( Q- g) A. u/ v; x# t6 Q    如果不设置host,nova会通过scheduler选择一个新的主机(不会分到原主机,因为rebuild函数中过滤了原主机)6 k1 n/ s9 U+ r
3. 这个调用只是发送了evacuate操作命令,具体是否真正疏散成功,无法知道
$ N8 C5 `9 q& d9 |* S$ S
1 O9 G1 Q3 i' F, l# Y+ R  |* w" v9 g三. 源码分析, r: _: y/ I# G
对应的是/nova/compute/api.py
2 V* k) \3 j% _7 d6 h5 R9 w1 d@check_instance_state(vm_state=[vm_states.ACTIVE, vm_states.STOPPED,
, ^6 U9 j! G# E4 c) K% K" C                                vm_states.ERROR])
1 u: j# Q% v: y3 e3 Sdef evacuate(self, context, instance, host, on_shared_storage,  \- K8 m) C% ]) m+ E+ }& a
            admin_password=None)
( M, x5 T3 ^* M5 O$ G/ [1. 函数上方有装饰符 @check_instance_state, b+ g/ J! X2 j# P% B/ x
表示在执行evacuate方法前先执行check_instance_state:检测传入的instance的vm_state是否为ACTIVE、STOPPED或ERROR。如果不是这三种状态,不能执行evacuate方法。7 ^" J+ R: ]& }. |& f
. H; R$ Y# e/ U- ~
2. 首先检测instance所在主机的状态是否为down,如果不是down(比如up),执行会出错。
2 N: K/ C, N7 p7 U! w" \. Z$ {LOG.debug('vm evacuation scheduled', instance=instance)
6 s, h; F* ?  w/ }9 b  r( d+ X6 W/ }3 D# 原实例所在主机% Q; P: @% e; g$ b6 }
inst_host = instance.host
. L& V: V$ M5 ^( l6 w  n" Lservice = objects.Service.get_by_compute_host(context, inst_host)
( P+ R+ ]6 A$ A/ T- n  j& s# 首先确保compute主机的状态为down6 `5 v) r4 c/ p, I; ~# N! s/ Q" f
if self.servicegroup_api.service_is_up(service):$ E5 G  F- Z$ T6 ^' O
    LOG.error(_LE('Instance compute service state on %s '
  N. U  U& t# Y( n- \4 P                  'expected to be down, but it was up.'), inst_host)
; `& h1 p! b: _# a    raise exception.ComputeServiceInUse(host=inst_host)0 `4 W/ ]3 V. g5 w

4 q& i& p7 H4 z. G3. 记录action执行操作
9 B5 K6 t0 f' f# N. E1 C: Q8 v# 实例的任务状态设置为REBUILDING
1 Z5 t; n5 U6 }- Iinstance.task_state = task_states.REBUILDING: l1 o8 R/ x& B8 e
instance.save(expected_task_state=[None]): u: L  R- M! y4 d" ^) X
self._record_action_start(context, instance, instance_actions.EVACUATE)$ X; h6 v8 h1 V7 o

3 F4 @- |# G  s+ J" K; D3 W- ~1 k) l4. 初始化迁移类" B& B5 l3 k* A1 Q
migration = objects.Migration(context,3 r! U+ j8 a0 o
                              source_compute=instance.host,4 y& K8 z! q$ e" ], Y" m
                              source_node=instance.node,
: L6 ]' [# M' r; w- C                              instance_uuid=instance_uuid,  v% X, |. I& Q* P
                              status='accepted',
* W  `2 U  S9 S                              migration_type='evacuation')
- X2 u- [8 n( l7 S$ M7 T# E5. 创建迁移(这里为什么要创建migration,并没有执行迁移)
4 a9 m4 o3 V6 K( T# 如果提供了目的主机' O0 |5 ?0 R+ w% }
if host:
) I; M5 J1 S. y    migration.dest_compute = host
' [1 o' X& P. l+ X) Q* gmigration.create(): y0 g6 [4 Y+ ~  z$ J- c

' X- X! C8 F* j+ k6. 发送消息通知实例的使用配额
; q2 x: {% A; v( ?  I" J( M$ kcompute_utils.notify_about_instance_usage($ l, r" l) @$ s
    self.notifier, context, instance, "evacuate")
1 [4 U" o% A9 f2 B
0 g' z" o$ @* X, l7. 最后执行task任务:rebuild_instance( O5 @+ }% F0 ?) ?+ v+ ]! t
所以evacuate的本质是在新节点上执行rebuild操作
# \" n! b. w" l" X4 M0 v0 N' Zreturn self.compute_task_api.rebuild_instance(context,
* y8 p2 X" F1 t3 Q3 g            instance=instance,
  Q7 s6 f/ n; [6 e( ?  D            new_pass=admin_password,7 B* t+ Q6 ]! z1 A9 N
            injected_files=None,
: G' Q) G5 f1 F. X" i2 z* m3 B+ A            image_ref=None,
: y" f) L6 n  k+ n            orig_image_ref=None,
, h0 m3 P1 }# W2 b7 ]3 p# E            orig_sys_metadata=None,7 T  u2 p9 d/ C/ J. n0 Y5 ?
            bdms=None,* W2 e* _0 D6 H2 N7 [- e
            recreate=True,: K; B, P0 B7 M/ a
            on_shared_storage=on_shared_storage,: Y* y1 o% p/ _  H
            host=host)
5 m8 H: u+ X) Z& }/ }  W2 A6 T深入分析rebuild_instance方法,通过各种rpc调用,最终具体执行的是/nova/conductor/manager.py8 z! p4 d1 y1 P" \4 E
def rebuild_instance(self, context, instance, orig_image_ref, image_ref,3 w' s. {* o2 u1 q% c# B; A) C
                    injected_files, new_pass, orig_sys_metadata,+ p! U3 C2 T: x$ Z% A! x% s& b
                    bdms, recreate, on_shared_storage,7 K6 B. k( r6 g. @* z8 _) k- l
                    preserve_ephemeral=False, host=None):) B0 v1 U: z7 d  M. t. J
(1)在选择新目的主机时先排除instance所在主机
* S" }+ k1 O9 |% y7 H4 U" b4 s这样能确保不会在原主机上执行rebuild操作
! g/ Q  Y& U7 j. i2 z2 _( S# 排除原实例所在的主机,即不能在同一个主机里进行rebuild3 u' A5 \4 B& }: U' H
filter_properties = {'ignore_hosts': [instance.host]}" }5 X5 g5 N; T  }
hosts = self.scheduler_client.select_destinations(context,% ?. y2 l5 n2 v4 r/ h6 l
                                        request_spec,
5 g8 O* R* _4 e! w8 l+ c8 `8 m                                        filter_properties)( }1 w( Y3 U: C4 y% J; T
(2)接下来会通过scheduler模块筛选出合适的新主机& D. U# C9 {0 X3 r$ C: M0 x
(3)如果没有选出足够的合适新主机,则抛出异常. t" r" P* a' H' v% N
except exception.NoValidHost as ex:
$ X4 }/ z# N" P% v# c: b8 S    with excutils.save_and_reraise_exception():
/ p( a% W0 o3 u. H0 Y# p+ [        self._set_vm_state_and_notify(context, instance.uuid,- v7 l( l& ]1 N. q
            'rebuild_server',0 E6 ]$ I( C1 D; H3 t
            {'vm_state': instance.vm_state,
" B- u5 g2 Y/ r, Z7 I5 P5 v2 L            'task_state': None}, ex, request_spec)2 f3 p6 K0 C3 x7 s7 s) a8 [# p3 h
        LOG.warning(_LW("No valid host found for rebuild"),
# H1 e, w3 W1 R! `% C& Z5 j  f                    instance=instance)
# W- c, d/ `1 ]4 p: i: ^6 L* [( \% I不能选出合适的新主机,有可能是除了原节点外,其他节点都不可用(computer service status:disabled)或网络不通(computer service state:down),导致没有合适的新主机。) O  }1 u# p7 F# B2 z4 V

3 O) s+ Y1 f- b$ O
 楼主| 发表于 2021-8-30 17:36:52 | 显示全部楼层
前言: 因为机房服务器运行不稳定的原因导致计算节点挂掉,然后上面的Centos7虚拟机在迁移之后开机报错。这个解决方法同样适用于其它操作系统的虚拟机。基于镜像创建的虚拟机实例。
I/O error, can't read device /dev/vda 的报错信息
首先做疏散先把虚拟实例从宿主机上面疏散到其它主机,关闭云主机。

1 b" o; k$ t; ?4 m4 u( y
1.找到虚拟机的ID可以通过dashboard界面或者使用openstack server list命令,找到虚拟机的ID;然后查看虚拟机的详细信息。
比如:
3 z- E. \% z. Y. L( ~( W( h
                               
登录/注册后可看大图
nova show 8fa3d2eb-2401-48a9-850a-f800314c6950# 与这个命令相同功能的命令还有openstack server show ID
0 U! m- `" b4 @9 s2 J/ V5 Y
                               
登录/注册后可看大图
连接到所在的计算节点,实例名称确定是哪台主机。
注意要主机是开机状态才能看到

3 H6 G) j* I- P& R; X) C/ a; G                               
登录/注册后可看大图
通过ID可以确定该虚拟机实例的数据目录,如果openstack没有对接存储的话那么在这个目录下就会存在数据文件,因为对接了ceph所以信息在libvirt.xml的文件里面。

8 q, x  Y8 m4 }% O/ p( Y) o                               
登录/注册后可看大图
cat /var/lib/nova/instances/8fa3d2eb-2401-48a9-850a-f800314c6950/libvirt.xml 里面就是它的vda的ID。

% F, E( T7 v1 E6 K- b& [                               
登录/注册后可看大图
2.当找到这个磁盘的ID之后,在ceph集群里面去查看这个设备
rbd ls volumes | grep 8fa3d2eb-2401-48a9-850a-f800314c6950

' K; I* P% z  N$ U$ a4 |0 T+ M                               
登录/注册后可看大图
3.取消它原来有的一些属性
# 查看卷rbd info volumes/0859147d-27aa-49a5-8373-7c515c4f3a02_disk#取消它原来有的一些属性;根据ceph的提示操作,因为有的属性linux不支持。rbd feature disable exclusive-lock object-map fast-diff  deep-flatten --image 8fa3d2eb-2401-48a9-850a-f800314c6950_disk -p volumes
4.把它映射到本地
rbd map 8fa3d2eb-2401-48a9-850a-f800314c6950_disk -p volumes# 如果映射不了执行下这个命令。rbd flatten volumes/8fa3d2eb-2401-48a9-850a-f800314c6950_disk
5.使用命令修复
# 有的可能修复不了就只能做好丢失数据的准备了xfs_repair -L /dev/rbd0p1可以ls /dev/rbd* 查看一下,rbd0p1表示的事一个启动分区。
6.取消映射
rbd unmap 8fa3d2eb-2401-48a9-850a-f800314c6950_disk -p volumes
这个时候再重新启动就正常了。4 C" j$ @( h7 U( ?! Z% f. \1 F- t; ?  t
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

北京云银创陇科技有限公司以云计算运维,代码开发

QQ|返回首页|Archiver|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )点击这里给我发消息

GMT+8, 2026-4-8 21:22 , Processed in 0.058175 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

快速回复 返回顶部 返回列表