易陆发现互联网技术论坛

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

openstack 疏散功能nova evacuate

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

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

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

x
[root@controller1 ~]# nova help  evacuate' l  s/ Y# F" k* z% y
usage: nova evacuate [--password <password>] <server> [<host>]( ?+ L) c( p+ E0 u
Evacuate server from failed host.( G& c) _2 f  o& i# y7 Y. p
Positional arguments:8 a; @7 [/ ~6 H: |7 g; c
  <server>               Name or ID of server.
4 q0 N$ Z$ w: b, q) k5 u5 w  <host>                 Name or ID of the target host. If no host is0 W  S$ C( \) O9 K3 |% s; B3 E4 F
                         specified, the scheduler will choose one.
# D- L0 f4 b. z; f+ GOptional arguments:
0 {, i7 `& M1 T$ ~2 u% E+ e  --password <password>  Set the provided admin password on the evacuated
5 M0 I, z7 Y$ L; W                         server. Not applicable if the server is on shared
, r3 T" ^/ C/ v" a6 v+ h% T                         storage.
/ ~* D4 S- l/ a2 R9 @
 楼主| 发表于 2021-8-30 17:35:13 | 显示全部楼层
前提条件:' k9 C: q6 X. f# r
openstack和ceph集成完成,保证虚拟机系统盘运行在ceph上
5 Y& P% R( M* @& }* K1 i0 Y
: {2 N8 E9 W7 O4 O; M配置步骤:, U7 _- [% d* I0 ^8 n$ |/ t
1.在各个计算节点之间做root的ssh认证,可以相互免密登录5 k9 @. b" x9 x1 e/ I+ Y$ |! |
2 r$ x# l, R! }# M/ b2 z" T8 X& N" F2 y
2.配置libvirtd服务修改配置
7 u+ \' n* b! |: g
4 G0 C( W5 w. l: H6 w# vim /etc/libvirt/libvirtd.conf. E) l$ L: ?. N) ^; f( ?

5 K/ g: X4 }. t3 J2 A* a8 Xlisten_tls = 0
3 G/ O' Q# L: C6 `& p: D' O, a, klisten_tcp = 1
; m& g  w" c7 X8 tunix_sock_group = "root"
# a) ~( g0 C5 Q2 Wunix_sock_rw_perms = "0777"
$ ]1 ]+ {+ \- `1 k. Y) O8 }. tauth_unix_ro = "none"
3 `6 p/ g; \/ s+ fauth_unix_rw = "none"
, [- x2 B9 X: L, @, h* Y% X8 \log_filters="2:qemu_monitor_json 2:qemu_driver"
, d% b& f( M9 Z2 ^7 \7 C# M( plog_outputs="2:file:/var/log/libvirt/libvirtd.log"( W3 M9 f4 ]! O( K( V
tcp_port = "16509"
: Y8 _2 q* h7 c9 O. [: G9 r+ ~, \listen_addr = "0.0.0.0"
. |9 G% e$ R: A. k4 P. H( _auth_tcp = "none"
6 G, s1 K! O7 c修改配置7 P7 H5 `) c; e" i
/ K' V3 G5 Y9 T0 x% T! J
vim /etc/sysconfig/libvirtd
( E& J4 X2 }+ Z" g
" p4 r! L# ?! s( y' g4 o( aLIBVIRTD_ARGS="--listen"6 z  D! r$ e( N% a
#重启libvirtd服务- [/ w+ `: x7 U/ G9 h. f6 p7 S

( H; A8 `2 S/ r/ l- }# systemctl restart libvirtd
1 q' g5 y  V) a6 R9 p9 [9 s: s3.执行热迁移
$ {# h+ g( z, D; [" g
" n. _# p6 y  _/ d6 n( W( D0 \# openstack server migrate 3aa7f750-0867-43e8-accb-d2262ab99932 --live compute01
/ ?8 Y3 Q! z  @8 i1 B4.疏散步骤1 _0 F  R; D. D5 R' n' ~% y3 r
4.1 主机查询2 c$ G! L4 C, s& y! l2 I

1 T4 e% g/ G! o* l  M+ U5 X1 c# openstack host list
  ~! V. G: k; p[root@controller1 ~]# openstack host list ! g: v+ ?' g) x& V  a
+-------------+-------------+----------+8 R, r+ Q1 i! V0 c  g
| Host Name   | Service     | Zone     |
/ ?% q, B% }* ]+-------------+-------------+----------+' D: |- v2 }1 g9 d" H( S3 W) K& o
| controller2 | scheduler   | internal |
! W% I& D/ W/ d- V3 A| controller3 | scheduler   | internal |( b( ^6 f' g% _7 T
| controller1 | scheduler   | internal |
3 \  n# n8 ^3 `) k| controller3 | conductor   | internal |  r. l& }3 ?$ S3 ^: G; L
| controller1 | conductor   | internal |
5 V2 M: b& _3 |# O7 ^; ]) ^| controller2 | conductor   | internal |/ a5 s/ o$ t  C+ U3 D' A: P
| controller2 | consoleauth | internal |
, f( H4 r8 `# t% d0 o: _| controller1 | consoleauth | internal |
' Y# H9 G* k/ h' F8 t| controller3 | consoleauth | internal |
! H& ]0 W9 _: }% E8 q* h1 l" _| compute02   | compute     | nova     |
9 ?$ l; f) _9 u1 a) }; t2 q: H| compute03   | compute     | nova     |
0 r8 S  F# U+ Q| compute01   | compute     | nova     |
$ ]% H8 A6 |8 P* E+ }+-------------+-------------+----------+. b4 e% t7 \* G

3 o5 {) g4 J( u6 o6 K; J  e: V5 Q2 Q5 A; W9 Z; k
4.2 执行疏散* Y7 ~5 W0 q2 i: y  w4 s6 d
0 r5 n9 {8 @! y% i/ M' s2 ?4 @
一台计算节点的所有虚拟机疏散到另外一台计算节点
4 Y8 }7 R2 f- l2 [2 a( ^# r5 J2 o- x& u, o

2 D7 Z2 X1 l! j
" L) p* h3 L% O* }9 z; ?. ?# nova host-evacuate --target_host compute02 compute01
% x6 U# ^: C; }" v1 E# E! P一台计算节点上的一台虚拟机疏散到另外一台计算节点
8 w6 H0 i  L1 g
8 M7 V1 M0 U/ j+ F9 G# nova evacuate 3aa7f750-0867-43e8-accb-d2262ab99932 compute02+ ~: B& R9 W) R; x% F2 W* y- g

6 \1 l) N/ h3 n4 O, x6 E5 ^' i& m; |- q2 q  z  S5 E" @2 N0 |
[root@controller1 ~]# openstack host list 8 ^1 O  S4 K  D/ F& k" R- z
+-------------+-------------+----------+
; u' ?: L& S2 A; K2 y& P; J# P| Host Name   | Service     | Zone     |. _- z3 ?2 w& ~0 q
+-------------+-------------+----------+$ B4 |0 o  y0 M2 d
| controller2 | scheduler   | internal |
; G  O$ N8 w9 W1 d) G  S! J| controller3 | scheduler   | internal |+ v9 _, D0 U% p
| controller1 | scheduler   | internal |' p2 c1 o9 X8 M, Q; }' V0 Z$ p( v2 U
| controller3 | conductor   | internal |+ H/ J0 ]7 R) y- y& ?
| controller1 | conductor   | internal |
9 a( g& I' z- F5 f0 l1 P/ O% T| controller2 | conductor   | internal |
1 V7 j: H+ t9 F# t/ v/ c  K/ N| controller2 | consoleauth | internal |; Z8 O$ {% ?; w5 i
| controller1 | consoleauth | internal |
/ M* U/ \' }8 `| controller3 | consoleauth | internal |
6 X  Z# K# W2 N; {8 P| compute03   | compute     | nova     |
6 x" p6 h: j/ v, D9 N. F  F. h$ ?7 K/ @| compute01   | compute     | nova     |
9 g* V' _# e) d$ ]0 P$ G2 W$ ~+-------------+-------------+----------+6 Z( b- L4 D5 D8 n# U5 ]1 D/ C
0 U+ T9 M7 L+ M6 P$ ~+ F- w* o
[root@controller1 ~]# nova host-evacuate --target_host compute02 compute01* p; @4 |# p# L# n
+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
- W; o8 d1 ^6 N/ M| Server UUID                          | Evacuate Accepted | Error Message                                                                                                                                    |. c' \' k& q6 T: O$ H+ N3 _" c
+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+7 H( Z; x: d' k# j
| 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) |: m0 H( M8 n8 b( g% o! U4 J
+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
0 u& E9 D$ _& [" |8 G6 B[root@controller1 ~]# nova host-evacuate --target_host compute02 compute03
( L4 c1 [8 G7 i* d0 k/ [# g' \" t+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
0 r" F( W+ p& V* N/ s% E. _| Server UUID                          | Evacuate Accepted | Error Message                                                                                                                                    |
7 A9 x1 y: _# r; H3 f  w' |5 D+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+$ e) B: _! ]& u6 M: \3 r- y
| 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) |
% [0 S- A: N2 F; {7 G% _7 ^+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+6 \3 T& ~2 _7 C) X, a6 L
1 C7 t$ q( n0 Y- N
[root@controller1 ~]# nova list
6 u8 `) |  m; r: b  g7 X$ f8 ~' T+--------------------------------------+----------+--------+------------+-------------+-------------------------------------+( m% c; Q5 p) F
| ID                                   | Name     | Status | Task State | Power State | Networks                            |
+ F2 n& E+ z6 _+--------------------------------------+----------+--------+------------+-------------+-------------------------------------+
4 w- p3 m7 q/ U9 P4 Y| 7b01d71a-40d4-45fa-bf5c-97e676b2b9a2 | test1    | ACTIVE | -          | Running     | bridge=192.168.0.206, 192.168.0.233 |2 Z: t, ?/ N  |. @
| 590e3822-085b-4273-bce1-bf0e7a09b9f7 | zhangyj1 | ACTIVE | -          | Running     | bridge=192.168.0.223                |6 |) A0 Z; ^5 ?# X
| 347d5d2e-1516-41ef-b247-a42bc72e093c | zhangyj2 | ACTIVE | -          | Running     | bridge=192.168.0.201                |' O( V; l0 s8 _/ X% n4 t$ S6 F  X
+--------------------------------------+----------+--------+------------+-------------+-------------------------------------+. R; ~3 i, Q3 t; e2 n
[root@controller1 ~]# nova evacuate  7b01d71a-40d4-45fa-bf5c-97e676b2b9a2 compute03
- U( k9 g! l* ]7 V9 b- o7 j[root@controller1 ~]# nova list , d% K$ h: ?% ?" x0 b8 m) K6 e6 ~
+--------------------------------------+----------+--------+------------+-------------+-------------------------------------+
$ Q! |5 F# @2 c| ID                                   | Name     | Status | Task State | Power State | Networks                            |
. Q" W! v. g- y8 G! L  S* n+--------------------------------------+----------+--------+------------+-------------+-------------------------------------+
" |9 Y! K* O; f! b| 7b01d71a-40d4-45fa-bf5c-97e676b2b9a2 | test1    | ACTIVE | -          | Running     | bridge=192.168.0.206, 192.168.0.233 |
; t+ |( o- g2 P. H7 J0 Y; I" A| 590e3822-085b-4273-bce1-bf0e7a09b9f7 | zhangyj1 | ACTIVE | -          | Running     | bridge=192.168.0.223                |
$ U7 D. t3 O0 L1 e1 \| 347d5d2e-1516-41ef-b247-a42bc72e093c | zhangyj2 | ACTIVE | -          | Running     | bridge=192.168.0.201                |
8 l. l+ d( B' n2 q4 _- T- F  N+--------------------------------------+----------+--------+------------+-------------+-------------------------------------+
% X- W: \5 y) Y- a) G0 ~! D[root@controller1 ~]# nova show 7b01d71a-40d4-45fa-bf5c-97e676b2b9a2  }  ^# l; a7 g+ H. W4 s# E9 w
+--------------------------------------+----------------------------------------------------------------------------------+
4 w5 C' U7 {; l% \| Property                             | Value                                                                            |( |5 f, _8 a0 @7 G! i4 E
+--------------------------------------+----------------------------------------------------------------------------------+
, t: @$ F: a# D& l& O| OS-DCF:diskConfig                    | AUTO                                                                             |, }: x: D+ W( |- h
| OS-EXT-AZ:availability_zone          | nova                                                                             |2 g* `. B; S* P& j0 s/ M0 @
| OS-EXT-SRV-ATTR:host                 | compute03                                                                        |1 [  s* f& `  q0 I( R
| OS-EXT-SRV-ATTR:hostname             | test1                                                                            |
% A, R3 ]- ^7 h0 {9 n: _| OS-EXT-SRV-ATTR:hypervisor_hostname  | compute03                                                                        |
2 T5 }' q. y' W3 B' D| OS-EXT-SRV-ATTR:instance_name        | instance-00000002                                                                |3 h9 l! Q3 c0 \
| OS-EXT-SRV-ATTR:kernel_id            |                                                                                  |
% I3 {8 f! k9 C" e( Z| OS-EXT-SRV-ATTR:launch_index         | 0                                                                                |
- g0 l$ {, b# g: t- D( |0 [5 n| OS-EXT-SRV-ATTR:ramdisk_id           |                                                                                  |" j' @# h- q7 u7 j2 L9 E
| OS-EXT-SRV-ATTR:reservation_id       | r-uqofhf0v                                                                       |
: b8 Y9 D' y6 U8 V. t/ i. X( [| OS-EXT-SRV-ATTR:root_device_name     | /dev/vda                                                                         |! G8 r- I% O: I& U" `+ b- U
| OS-EXT-SRV-ATTR:user_data            | -                                                                                |9 O$ l( q( b( ?7 O; X
| OS-EXT-STS:power_state               | 1                                                                                |  {# y7 L+ d. G- g
| OS-EXT-STS:task_state                | -                                                                                |$ F& b$ S: m$ s4 t  `5 S/ R
| OS-EXT-STS:vm_state                  | active                                                                           |
8 l) L8 u) w! t| OS-SRV-USG:launched_at               | 2021-08-31T01:25:16.000000                                                       |7 C/ ]1 k! v5 [
| OS-SRV-USG:terminated_at             | -                                                                                |
5 T) G$ r2 I3 r| accessIPv4                           |                                                                                  |8 F- l/ Z( H/ z& [
| accessIPv6                           |                                                                                  |
9 u) `! e- Q4 v/ K| bridge network                       | 192.168.0.206, 192.168.0.233                                                     |
; K" H) [: Z4 F| config_drive                         |                                                                                  |, D. Q% ?) g8 t2 m
| created                              | 2021-08-25T07:37:43Z                                                             |
4 {7 X6 Q% _/ g| description                          | -                                                                                |% B5 Q) Q! y2 ^, E
| flavor:disk                          | 10                                                                               |
2 j6 j% F9 I- M9 n" g| flavor:ephemeral                     | 0                                                                                |
/ p) t& m" v* E: W4 X: C2 b+ Q| flavor:extra_specs                   | {}                                                                               |
$ v9 m( {/ a8 n- `5 u8 S( T| flavor:original_name                 | type-1c-1g-10g                                                                   |# c- O1 O- A! g8 d! B4 D
| flavor:ram                           | 1024                                                                             |
% ^& H1 i+ P8 u4 N) r5 N| flavor:swap                          | 0                                                                                |
. b- m2 D3 I! e! i' n0 || flavor:vcpus                         | 1                                                                                |
' Y2 u; R6 V5 P* W| hostId                               | 35bcc54020d6ae54aebe586983a9df9d8562a0201cea0c0d85e39455                         |
  ^, P3 M8 d. h. p| host_status                          | UP                                                                               |
5 ?% o+ q( d3 [& l2 I- f& e( v+ t8 b6 a| id                                   | 7b01d71a-40d4-45fa-bf5c-97e676b2b9a2                                             |2 C9 t* P4 Y& G1 m! o5 a, D
| image                                | Attempt to boot from volume - no image supplied                                  |
& a( d; H' Y) [7 e| key_name                             | -                                                                                |
7 Y8 R3 E9 V( P1 o| locked                               | False                                                                            |2 r, `! b% S+ {
| metadata                             | {}                                                                               |* D* D  l* t( }* X0 s
| name                                 | test1                                                                            |: c3 Y0 I: l2 W. G7 r
| os-extended-volumes:volumes_attached | [{"id": "d385a405-529b-450e-98e7-44aad0d3e94a", "delete_on_termination": false}] |
: w) ^5 I8 `/ V2 m1 ^3 l) N| progress                             | 0                                                                                |% q9 a/ @* k; P
| security_groups                      | default                                                                          |( L) k9 v' M* C8 x
| status                               | ACTIVE                                                                           |$ ?* E' j$ k; w2 C( e% U
| tags                                 | []                                                                               |6 f1 C) v0 O! H7 ?* j$ W. t
| tenant_id                            | 92a5a26fc14d418d881ade0ccbcffc59                                                 |& s. V/ ?% @; G9 r
| updated                              | 2021-08-31T01:25:17Z                                                             |
2 K' {& y8 [6 g2 T| user_id                              | b1ffbc1f84cf42c99a8e59fdaf7f1cf5                                                 |
: |6 p5 h: x7 ^7 f) k# x+--------------------------------------+----------------------------------------------------------------------------------+3 y) E0 [0 \+ }
————————————————
* [( f9 o  s- w9 I1 m, v
, c. w5 a& q% X# {+ z0 A
& B6 x3 I* I' A" n- x5 d
 楼主| 发表于 2021-8-30 17:35:43 | 显示全部楼层
一. 当实例所在的节点发生故障不可用时,可执行evacuate操作,在另外一个新节点rebuild该实例,实现高可用。8 u( P6 ]( p6 {9 j
这可以是OpenStack计算节点HA的一种实现方案。
! |( p+ [* T+ M- q9 Q
# m* P8 R! d( h  {二. API调用! I5 I9 b6 j0 [! k
nova.servers.evacuate(server=fm['id']), on_shared_storage=True
7 E2 d! j: ?4 u( ?( ^$ d1. on_shared_storage参数在2.14版本后废除,自动检查是否为共享存储。1 R% x8 @$ M- `5 r4 ?! D7 e7 n
    共享存储能够保证实例在另外新节点重建后数据不丢失  d  {4 S6 K% z8 Q
2. 可以设置目的主机host/ V: o. |6 }2 {' ?' J, ^- H  R
    如果不设置host,nova会通过scheduler选择一个新的主机(不会分到原主机,因为rebuild函数中过滤了原主机)( a' x! \9 `$ g, e& X
3. 这个调用只是发送了evacuate操作命令,具体是否真正疏散成功,无法知道- I' |1 |; v8 ^2 M9 J9 |

6 j' P: n( P% q6 s三. 源码分析$ J0 ^" N5 \( l- Y  M, X
对应的是/nova/compute/api.py
- i6 r5 _& T, a7 c% V+ Z  j2 d@check_instance_state(vm_state=[vm_states.ACTIVE, vm_states.STOPPED,/ c3 Y9 m4 p/ y5 s$ k* C7 [
                                vm_states.ERROR])
; ?0 m, {6 N8 y$ C( C9 D7 pdef evacuate(self, context, instance, host, on_shared_storage,( C- \- ]/ _8 X+ e4 L3 I- E
            admin_password=None)$ T2 [: n; J$ P9 n5 ?
1. 函数上方有装饰符 @check_instance_state- ?: [% E" w2 o2 F% ~
表示在执行evacuate方法前先执行check_instance_state:检测传入的instance的vm_state是否为ACTIVE、STOPPED或ERROR。如果不是这三种状态,不能执行evacuate方法。
# c, m- |4 x) V$ x
8 Z( V5 t4 B3 S2 F) Z3 n2. 首先检测instance所在主机的状态是否为down,如果不是down(比如up),执行会出错。
- \% w' a% U. i. k3 S+ P; `LOG.debug('vm evacuation scheduled', instance=instance)
  C, V3 ?1 q; e( M# 原实例所在主机$ X( ^1 ^; ~$ c5 V: H
inst_host = instance.host
; u2 n0 Q+ h: i5 }1 x2 Uservice = objects.Service.get_by_compute_host(context, inst_host)4 S8 v4 W+ L5 Z. i
# 首先确保compute主机的状态为down
' m) h: w$ W1 kif self.servicegroup_api.service_is_up(service):
7 F. h' G4 w- I; r4 j    LOG.error(_LE('Instance compute service state on %s '. p- D  g% m/ }  t& l) u
                  'expected to be down, but it was up.'), inst_host)8 U" `% Q& h5 K% @
    raise exception.ComputeServiceInUse(host=inst_host); ^$ J, o3 k/ J, p4 P. t
3 _! d0 b$ I  `. J
3. 记录action执行操作
. s+ w) c& p- [1 A/ U# 实例的任务状态设置为REBUILDING% m0 C7 _0 n8 g3 l+ i# J
instance.task_state = task_states.REBUILDING% p) @$ b( Q3 g
instance.save(expected_task_state=[None]); `& S" L6 m& W7 {4 x, z
self._record_action_start(context, instance, instance_actions.EVACUATE)3 U+ E$ F: N( S( V6 a! {, w
# y4 [" b( w8 r% i/ g4 c
4. 初始化迁移类: o$ ?8 D3 |- f) s  y! M# p0 ?
migration = objects.Migration(context,
+ L6 U4 |" [+ E5 v  a                              source_compute=instance.host,
' w& u+ z8 {8 A2 {6 `/ s: d0 F( i                              source_node=instance.node,5 n; Y  @2 _8 @! i7 a8 F
                              instance_uuid=instance_uuid,; c: Z4 T8 n; [: w: H
                              status='accepted',7 r/ Q( H. u) U$ d  a
                              migration_type='evacuation')  _7 @# T1 n5 G( n3 |5 p
5. 创建迁移(这里为什么要创建migration,并没有执行迁移)0 B# i7 m* J3 t% |$ d2 B. r& d
# 如果提供了目的主机! Z8 J: b( G' ?
if host:$ ~" A/ u7 _& Q2 u5 |8 @0 @
    migration.dest_compute = host
7 x5 A+ f3 H) B- o  g. Q4 I' S- u' Fmigration.create()6 [9 n5 j3 O& N6 y8 n

8 M( G" B+ A% q4 Q6. 发送消息通知实例的使用配额
# Q5 W" `8 |# ycompute_utils.notify_about_instance_usage(' l) j# D) I% a' n
    self.notifier, context, instance, "evacuate")
$ A( t& \* G  k* t* X6 Y: X, a& \! l& {* g7 ^
7. 最后执行task任务:rebuild_instance# \6 p( @" d7 E( o
所以evacuate的本质是在新节点上执行rebuild操作
6 `- B, Z+ @2 C' y( U' Yreturn self.compute_task_api.rebuild_instance(context,
8 h$ S; B9 S  h4 [            instance=instance,  ^6 \! A7 b' T1 k4 W2 W6 {' f
            new_pass=admin_password,
" e$ O+ G) u0 f% O8 e7 p            injected_files=None,
, B7 z) s8 k9 B! D7 Q2 w            image_ref=None,7 w/ I: |3 i' ]5 m; \4 N7 r
            orig_image_ref=None,# y1 }, o1 D7 @$ b* |8 ?  X
            orig_sys_metadata=None,+ R- t- B8 D0 B# z1 D) E. K
            bdms=None,
) f8 N. r- H: T* T            recreate=True,
, f# h# K- H% w8 d! }, i6 W            on_shared_storage=on_shared_storage,
: V* n+ ]% w" W- p8 e: d            host=host). C% t7 x2 p& Y
深入分析rebuild_instance方法,通过各种rpc调用,最终具体执行的是/nova/conductor/manager.py3 a' @- z* Q/ s% f) s7 c1 T
def rebuild_instance(self, context, instance, orig_image_ref, image_ref,
- {- w" Z  b: K                    injected_files, new_pass, orig_sys_metadata,
% _& U) X" v' i7 z' N& T; J9 C- A                    bdms, recreate, on_shared_storage,8 T% j5 j! c. m4 E
                    preserve_ephemeral=False, host=None):/ b6 t8 l2 j. m
(1)在选择新目的主机时先排除instance所在主机
' E% L2 f& b  v$ F3 I这样能确保不会在原主机上执行rebuild操作
% h# j9 @# z# l; }6 y# 排除原实例所在的主机,即不能在同一个主机里进行rebuild' p) S7 [' O; R7 K* L7 v
filter_properties = {'ignore_hosts': [instance.host]}
) K- X( n" R  t  E+ dhosts = self.scheduler_client.select_destinations(context,
: N  e, z( T% D) {; \                                        request_spec,
# B7 |3 T2 t$ H; P$ K                                        filter_properties)5 T' L8 h) V$ c+ o  h, C
(2)接下来会通过scheduler模块筛选出合适的新主机
# s9 \; y' T2 c3 j6 ^(3)如果没有选出足够的合适新主机,则抛出异常. T% L' u# e3 ?" h# \  B' C9 d
except exception.NoValidHost as ex:, U8 ~. p/ Q! D
    with excutils.save_and_reraise_exception():
! ~+ r1 q7 e) R; A        self._set_vm_state_and_notify(context, instance.uuid,
  S! I; o9 |! `+ }( H7 N* e2 b3 U            'rebuild_server',! X. B% }& W+ g4 T; {
            {'vm_state': instance.vm_state,
; P2 M' j, x0 Z2 l$ A            'task_state': None}, ex, request_spec)* @/ ?2 h, t7 G0 _
        LOG.warning(_LW("No valid host found for rebuild"),  `2 x6 x  b' q; `
                    instance=instance)
! }1 \& b- l, a; \4 u不能选出合适的新主机,有可能是除了原节点外,其他节点都不可用(computer service status:disabled)或网络不通(computer service state:down),导致没有合适的新主机。. v" i. E, ]. G& c0 l/ D0 A9 H" ~

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

% F: K( f6 U! X9 \/ K, I0 v5 V
1.找到虚拟机的ID可以通过dashboard界面或者使用openstack server list命令,找到虚拟机的ID;然后查看虚拟机的详细信息。
比如:
+ `, d) w$ ~) A5 E
                               
登录/注册后可看大图
nova show 8fa3d2eb-2401-48a9-850a-f800314c6950# 与这个命令相同功能的命令还有openstack server show ID
5 t0 M0 ^# G5 _/ M$ D
                               
登录/注册后可看大图
连接到所在的计算节点,实例名称确定是哪台主机。
注意要主机是开机状态才能看到
8 w. F- n- ~' A
                               
登录/注册后可看大图
通过ID可以确定该虚拟机实例的数据目录,如果openstack没有对接存储的话那么在这个目录下就会存在数据文件,因为对接了ceph所以信息在libvirt.xml的文件里面。

; y8 ?% [1 W, R                               
登录/注册后可看大图
cat /var/lib/nova/instances/8fa3d2eb-2401-48a9-850a-f800314c6950/libvirt.xml 里面就是它的vda的ID。
$ n% s2 E) M( w/ r
                               
登录/注册后可看大图
2.当找到这个磁盘的ID之后,在ceph集群里面去查看这个设备
rbd ls volumes | grep 8fa3d2eb-2401-48a9-850a-f800314c6950
- ^9 G  o8 D1 _$ c. N7 n8 ?+ r! L
                               
登录/注册后可看大图
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
这个时候再重新启动就正常了。/ t2 ]9 \6 |+ Q; e' e; `9 d; o) O! _) F
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

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

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

QQ|返回首页|Archiver|小黑屋|易陆发现技术论坛 点击这里给我发消息

GMT+8, 2026-4-8 19:06 , Processed in 0.049423 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

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