找回密码
 注册
查看: 2341|回复: 3

openstack 疏散功能nova evacuate

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2021-8-30 17:33:16 | 显示全部楼层 |阅读模式
[root@controller1 ~]# nova help  evacuate
7 d( t) p4 a. S2 Uusage: nova evacuate [--password <password>] <server> [<host>]  Z+ l& i9 A; |6 r7 D5 A* Z& ~
Evacuate server from failed host.9 y* S# }5 z8 f( u: Z; u/ D
Positional arguments:
2 i' H3 \9 i) X  <server>               Name or ID of server.8 k/ z" V' u* Q* h) O
  <host>                 Name or ID of the target host. If no host is7 E' l& D- a& P2 ]) E7 f% B
                         specified, the scheduler will choose one.
- ?" t3 T8 b7 |* A* p! }Optional arguments:; T& C0 D$ A$ U$ h& y5 ^
  --password <password>  Set the provided admin password on the evacuated* n! p* m4 T/ ^  }* t
                         server. Not applicable if the server is on shared
* H7 b+ ^' d. z! ?/ K                         storage.
/ {2 e. e) `- ]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2021-8-30 17:35:13 | 显示全部楼层
前提条件:3 y. j$ X; D* L4 q
openstack和ceph集成完成,保证虚拟机系统盘运行在ceph上2 J" s  P# S9 J2 J+ H, D1 Z
# F1 k2 s8 H4 V4 D3 G
配置步骤:
' J. H6 o! ^, }* {" G2 V3 E1.在各个计算节点之间做root的ssh认证,可以相互免密登录
. A" w5 M; z4 N& l. f4 d9 x3 j( k6 r2 r
2.配置libvirtd服务修改配置- V2 F$ c- \1 i
& j; N+ c5 ~0 v) W  u7 ^3 V
# vim /etc/libvirt/libvirtd.conf
/ e3 e( H5 o# x/ @8 K5 s+ E  g   ?+ ?% ?+ Q2 y  A
listen_tls = 0
1 {  q# a# T' o% [listen_tcp = 1
; w* M& f5 Z# F' f8 ]2 i* Kunix_sock_group = "root"
+ k+ N1 s) W% {& f% x9 ]) a- Sunix_sock_rw_perms = "0777"# }( L" G' e& f& P7 C; N
auth_unix_ro = "none"; K* x1 t" z" [/ C! }
auth_unix_rw = "none"
# y# S/ W& ~$ tlog_filters="2:qemu_monitor_json 2:qemu_driver"$ U" N) P0 K& i8 o
log_outputs="2:file:/var/log/libvirt/libvirtd.log"
9 N$ s/ i& U  L$ Q3 p. ~4 Qtcp_port = "16509"
, ^! m: b- G' }% xlisten_addr = "0.0.0.0"8 d4 i  }- V& t" ^
auth_tcp = "none"
: o+ V& X6 f0 R修改配置
! r+ o8 b2 b# P# F) P2 t0 ^' e3 X
3 b! P3 A8 f" Y# Pvim /etc/sysconfig/libvirtd
3 Z( m/ u. O% K+ U: V, O
; i2 G* @6 S( r5 uLIBVIRTD_ARGS="--listen"
& a' D( l+ [6 ^) Z) b- T#重启libvirtd服务+ U5 }# G0 ]# u2 x2 E% {

  e3 h+ H' E$ S) H: H# systemctl restart libvirtd% n5 M% `( V  l
3.执行热迁移
" x0 T& S; y: ]4 s( h$ R+ c# l' j
# openstack server migrate 3aa7f750-0867-43e8-accb-d2262ab99932 --live compute01
0 e2 s6 f, u5 ?5 z' Y$ W- ~4.疏散步骤8 [7 A" W9 \$ B
4.1 主机查询
+ J5 w; C" P: I+ }/ Y: A0 A3 x
( q( V' d% c* S7 P7 c# openstack host list
2 ]- \$ Q1 M  k7 P2 L( z* K[root@controller1 ~]# openstack host list
5 J8 G( z* s2 H# g' O" ~' b* e- E+-------------+-------------+----------+4 k/ l! ?5 q) k+ J
| Host Name   | Service     | Zone     |
# s$ U1 y/ P$ C+-------------+-------------+----------+- E3 F; A# \" ]) E
| controller2 | scheduler   | internal |
- ^& @. K, T5 j( X  V- d, f| controller3 | scheduler   | internal |! v. @) t9 _$ V: r
| controller1 | scheduler   | internal |
" l2 g9 l7 h: @! |" r4 e$ f| controller3 | conductor   | internal |
6 T* {8 M$ m: Y$ ^, H! F| controller1 | conductor   | internal |
: \% q5 q+ v4 O8 K' B% N, ~| controller2 | conductor   | internal |7 u9 R* P, e9 v& y# g# J! ^
| controller2 | consoleauth | internal |& A3 p* R9 O2 I1 {# p# p
| controller1 | consoleauth | internal |8 `/ N" [* o7 L- P! v9 z
| controller3 | consoleauth | internal |+ E5 V& ~5 R/ m9 [( |$ d
| compute02   | compute     | nova     |
$ Y* q: K7 R+ {5 F5 B2 d7 b| compute03   | compute     | nova     |
; [! q" g5 \% h| compute01   | compute     | nova     |% ~* v$ f: z! e. T
+-------------+-------------+----------+0 f4 `. O1 Q; B8 g6 F
& J$ W9 I: A3 G! L) L

( }0 G  j* a2 S9 a2 L6 P4.2 执行疏散
7 b0 v9 O9 V5 t/ b0 M
5 {0 z6 d: V9 l" v  m. E9 \一台计算节点的所有虚拟机疏散到另外一台计算节点
% f# ^) x5 b5 G# V' T- A+ a
5 o7 F/ K6 E7 J0 ?+ C, U" t! x+ ?& p/ s9 \1 ~6 S4 r+ |
+ [, U# [! ]9 L& c1 C
# nova host-evacuate --target_host compute02 compute01- m6 d2 ?1 W2 k
一台计算节点上的一台虚拟机疏散到另外一台计算节点
# x; p. I& X$ f4 r' `9 x& |: z
& L( a, W7 Y- D% `! a+ g# nova evacuate 3aa7f750-0867-43e8-accb-d2262ab99932 compute02
. N. M! D* t* V  m* g  X/ M3 h; b9 V

2 F% O% P7 z7 ], V  y# T2 E1 e4 @[root@controller1 ~]# openstack host list
$ @- Z0 K1 L5 D/ ?1 X& t/ Z. L+-------------+-------------+----------+
4 q4 x' l6 P. Z: E| Host Name   | Service     | Zone     |, |0 E5 q- v& n# S& x
+-------------+-------------+----------+8 q9 z$ M# j  q% K7 P6 v8 j
| controller2 | scheduler   | internal |
- r9 `+ b9 p/ I  T8 S3 f| controller3 | scheduler   | internal |. ^5 H1 K0 @* W2 f' d
| controller1 | scheduler   | internal |
1 H' r( Y1 u% ?- r3 h| controller3 | conductor   | internal |0 n$ a. k6 c5 d/ \' e7 u
| controller1 | conductor   | internal |
  K+ P3 Y% ]! P* \* {) S& V| controller2 | conductor   | internal |& c* k" v# U( ^, @) y0 r1 i, Z
| controller2 | consoleauth | internal |
2 q3 S9 _4 \/ W/ Q* q; R! z9 e| controller1 | consoleauth | internal |
; B8 Y3 }( Y: V0 F6 s| controller3 | consoleauth | internal |* c7 `+ Q" L6 e, b
| compute03   | compute     | nova     |9 M! u# Z8 I7 i1 ^
| compute01   | compute     | nova     |
6 @/ @4 [2 ]0 F$ S: l- G+-------------+-------------+----------+* D  T0 s( x4 w7 ?
7 }6 ~# z# B# m# }
[root@controller1 ~]# nova host-evacuate --target_host compute02 compute01
1 ?' X% W' A6 a$ l  \+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
; ~1 D3 Z- i2 j9 z3 w| Server UUID                          | Evacuate Accepted | Error Message                                                                                                                                    |
+ N+ M* G: v( {+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+7 h  i8 T" R- }* N7 a. |$ X& a3 O4 V
| 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) |+ v/ j: j1 a* d& R0 q7 j. R7 ?! S
+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
! y* U) Q4 K+ Q1 p( U! z7 H( g, I[root@controller1 ~]# nova host-evacuate --target_host compute02 compute03: c7 ?9 |- E2 J8 k9 g2 i
+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
9 \0 Q8 O& ?4 ]: ^| Server UUID                          | Evacuate Accepted | Error Message                                                                                                                                    |
( e6 c$ Z' d$ U! M5 b6 J6 Q+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+/ A4 R- O3 p: m) @5 p  L7 s4 j
| 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 h! V8 Y) a. l& h3 E+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+: g$ o+ y' S0 f' E

+ q& m. }6 l( W[root@controller1 ~]# nova list
9 j3 `& u- x6 `' ], c8 R0 A( ^+--------------------------------------+----------+--------+------------+-------------+-------------------------------------+# t6 x6 u* r$ ~  \+ V
| ID                                   | Name     | Status | Task State | Power State | Networks                            |
: d, n: |6 j) R/ P9 A3 j2 g6 y/ C+--------------------------------------+----------+--------+------------+-------------+-------------------------------------+( I$ p: p# U+ D; c3 d
| 7b01d71a-40d4-45fa-bf5c-97e676b2b9a2 | test1    | ACTIVE | -          | Running     | bridge=192.168.0.206, 192.168.0.233 |
8 v* b& g, j' W+ N| 590e3822-085b-4273-bce1-bf0e7a09b9f7 | zhangyj1 | ACTIVE | -          | Running     | bridge=192.168.0.223                |* r' R. Z" z8 d% Y& h3 Q
| 347d5d2e-1516-41ef-b247-a42bc72e093c | zhangyj2 | ACTIVE | -          | Running     | bridge=192.168.0.201                |
3 I  V4 n1 o' L9 @/ C+--------------------------------------+----------+--------+------------+-------------+-------------------------------------+4 L2 t4 l+ @/ i3 [- S2 ]
[root@controller1 ~]# nova evacuate  7b01d71a-40d4-45fa-bf5c-97e676b2b9a2 compute034 h' i) V+ B+ `8 @9 x
[root@controller1 ~]# nova list 5 E0 B# {0 V% e( t% H& o$ y" A
+--------------------------------------+----------+--------+------------+-------------+-------------------------------------+( ?1 o5 D+ c& S: b
| ID                                   | Name     | Status | Task State | Power State | Networks                            |
* G! T- w  j( Q. {2 d+--------------------------------------+----------+--------+------------+-------------+-------------------------------------+9 q. D8 e  M$ I5 H# G* c& a. d  v
| 7b01d71a-40d4-45fa-bf5c-97e676b2b9a2 | test1    | ACTIVE | -          | Running     | bridge=192.168.0.206, 192.168.0.233 |
' N' z/ f, |, V5 @6 o| 590e3822-085b-4273-bce1-bf0e7a09b9f7 | zhangyj1 | ACTIVE | -          | Running     | bridge=192.168.0.223                |
% j( U6 `' t3 S+ z1 \| 347d5d2e-1516-41ef-b247-a42bc72e093c | zhangyj2 | ACTIVE | -          | Running     | bridge=192.168.0.201                |+ x5 o1 B( v7 c' N
+--------------------------------------+----------+--------+------------+-------------+-------------------------------------+1 ]# w6 m7 L$ k7 i
[root@controller1 ~]# nova show 7b01d71a-40d4-45fa-bf5c-97e676b2b9a2
. X7 X: u8 H; w! a+--------------------------------------+----------------------------------------------------------------------------------+
/ [/ h& ?* m% a6 Q, w| Property                             | Value                                                                            |% a3 u+ C: C" u) w, O8 Q% u& @
+--------------------------------------+----------------------------------------------------------------------------------+
1 N  G1 _4 p% {7 Q5 U| OS-DCF:diskConfig                    | AUTO                                                                             |
4 g+ O6 x' n" G0 |9 o! \! U| OS-EXT-AZ:availability_zone          | nova                                                                             |
6 i9 w- o! T3 n| OS-EXT-SRV-ATTR:host                 | compute03                                                                        |
: B. o6 o5 o" ^2 A4 @9 X& f( _# S' _| OS-EXT-SRV-ATTR:hostname             | test1                                                                            |9 b2 O9 W9 o# g! r# _8 ?4 w' b' w
| OS-EXT-SRV-ATTR:hypervisor_hostname  | compute03                                                                        |
7 o, N; X( k* U  Q7 u) P, ?| OS-EXT-SRV-ATTR:instance_name        | instance-00000002                                                                |* S6 ?6 x. K/ x6 Q6 J' Y
| OS-EXT-SRV-ATTR:kernel_id            |                                                                                  |1 D$ b) i% \' ~2 o
| OS-EXT-SRV-ATTR:launch_index         | 0                                                                                |, r4 g1 G# _1 P( B4 ~$ D
| OS-EXT-SRV-ATTR:ramdisk_id           |                                                                                  |
# z2 @" [. y' `1 g: H: C, H0 X) E( |# C| OS-EXT-SRV-ATTR:reservation_id       | r-uqofhf0v                                                                       |
' _" U  o2 m' _% V! ]& K| OS-EXT-SRV-ATTR:root_device_name     | /dev/vda                                                                         |
/ ^: W/ ?1 G9 Y, l, Z7 D| OS-EXT-SRV-ATTR:user_data            | -                                                                                |
# Z8 j& |6 I8 p! r' ]5 _| OS-EXT-STS:power_state               | 1                                                                                |
' R1 u) \5 d# Q& W, G; Q$ }| OS-EXT-STS:task_state                | -                                                                                |9 i$ K1 y2 W$ K. n
| OS-EXT-STS:vm_state                  | active                                                                           |
5 Y* O9 ^1 s8 H' p9 l| OS-SRV-USG:launched_at               | 2021-08-31T01:25:16.000000                                                       |3 ?( o$ n3 ?/ {6 f
| OS-SRV-USG:terminated_at             | -                                                                                |* N& b5 Q' J! b
| accessIPv4                           |                                                                                  |
- t) z$ A' i0 D| accessIPv6                           |                                                                                  |; u: J" B( y4 ^4 L9 Q; T
| bridge network                       | 192.168.0.206, 192.168.0.233                                                     |
) ^# e: |3 ?9 t7 z/ S' N| config_drive                         |                                                                                  |
' a3 t% D8 V( H2 g, A2 P| created                              | 2021-08-25T07:37:43Z                                                             |
, |9 _% ]3 {4 S7 \4 f: t| description                          | -                                                                                |' X3 C1 A! q2 M2 F) M
| flavor:disk                          | 10                                                                               |
* O. N- j; ^9 O  Z% ~4 n4 f| flavor:ephemeral                     | 0                                                                                |
% r2 x9 D5 J" v' g" x| flavor:extra_specs                   | {}                                                                               |0 Q4 x0 }- c/ D3 m5 e
| flavor:original_name                 | type-1c-1g-10g                                                                   |
3 s- m0 g. J% z/ R| flavor:ram                           | 1024                                                                             |! ]( `8 Y1 l2 M% \9 z
| flavor:swap                          | 0                                                                                |& d, d- J# K0 f/ D
| flavor:vcpus                         | 1                                                                                |
; H& c/ z- \% l9 ^; j* B6 Q# Q7 d) ~4 w| hostId                               | 35bcc54020d6ae54aebe586983a9df9d8562a0201cea0c0d85e39455                         |1 b: F# D/ _4 R5 F' l6 a
| host_status                          | UP                                                                               |/ `/ x& l4 J7 W7 s1 `) |
| id                                   | 7b01d71a-40d4-45fa-bf5c-97e676b2b9a2                                             |, c- I$ h1 X- K, b9 `
| image                                | Attempt to boot from volume - no image supplied                                  |
7 L7 b3 r3 c& E' r! u  M| key_name                             | -                                                                                |
2 g. q, M. b. }. @5 z4 q/ T9 C, B| locked                               | False                                                                            |  m( F* w, \# q
| metadata                             | {}                                                                               |, A9 q# ^+ c9 q, x/ K
| name                                 | test1                                                                            |
' T+ K1 v" K6 || os-extended-volumes:volumes_attached | [{"id": "d385a405-529b-450e-98e7-44aad0d3e94a", "delete_on_termination": false}] |6 R9 F  b) [5 H5 d' J7 x. J
| progress                             | 0                                                                                |5 M# @* n* [5 Q/ r! f# h% X
| security_groups                      | default                                                                          |* l- n6 d: n. j& }+ \* A% p8 [! S
| status                               | ACTIVE                                                                           |% I2 N  `" `& K" Y" q4 H
| tags                                 | []                                                                               |: d. M% {1 C4 T# s0 J( Z: j) A
| tenant_id                            | 92a5a26fc14d418d881ade0ccbcffc59                                                 |0 |  V! U8 x! T" Z, q
| updated                              | 2021-08-31T01:25:17Z                                                             |  H/ j9 ^) [6 X8 z1 l
| user_id                              | b1ffbc1f84cf42c99a8e59fdaf7f1cf5                                                 |
4 L8 W. G- }. {6 C3 e5 \+--------------------------------------+----------------------------------------------------------------------------------+" `: B5 f) t7 m3 k2 q" Q
————————————————7 C- x  L: f& [2 W/ M5 y0 _
- _* x( {  b6 [$ J& L
  }. Q9 L$ e: s& w

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2021-8-30 17:35:43 | 显示全部楼层
一. 当实例所在的节点发生故障不可用时,可执行evacuate操作,在另外一个新节点rebuild该实例,实现高可用。
8 l1 K* p8 W8 s* n' s- h2 a5 w& z这可以是OpenStack计算节点HA的一种实现方案。
2 z8 k: R: g' D; ]* b; [
5 @/ j- h) J4 V) J, J# u: t) @二. API调用  \. K1 ~2 ~/ ~7 j
nova.servers.evacuate(server=fm['id']), on_shared_storage=True* j: X: a( S9 I* l) U1 f
1. on_shared_storage参数在2.14版本后废除,自动检查是否为共享存储。1 R3 f, s2 W. A0 ]/ e- {- }- o
    共享存储能够保证实例在另外新节点重建后数据不丢失
' {- @9 o9 l. R2. 可以设置目的主机host
; i/ W" a' m" r, q/ A/ n    如果不设置host,nova会通过scheduler选择一个新的主机(不会分到原主机,因为rebuild函数中过滤了原主机)
8 X; w$ E" h+ N$ _3. 这个调用只是发送了evacuate操作命令,具体是否真正疏散成功,无法知道
4 y8 r6 c8 A$ a4 S
4 a$ n) W! i" A  a3 r3 c三. 源码分析
; [! ~' J. o1 Q3 |! O- h对应的是/nova/compute/api.py
! O2 @6 l% I3 n/ N9 e! U- S8 @@check_instance_state(vm_state=[vm_states.ACTIVE, vm_states.STOPPED,+ p' S) ~, b5 O, ~4 ~$ m: S- `
                                vm_states.ERROR])9 q0 m( q$ B, Y6 K$ p
def evacuate(self, context, instance, host, on_shared_storage,  @8 C0 \% {! Y* M
            admin_password=None)5 P8 }5 V: ^* k& o$ D! I: s
1. 函数上方有装饰符 @check_instance_state
* U  ~1 A2 q0 z$ W* p* z- d& {# J( ?6 |表示在执行evacuate方法前先执行check_instance_state:检测传入的instance的vm_state是否为ACTIVE、STOPPED或ERROR。如果不是这三种状态,不能执行evacuate方法。
( _( i/ m8 v4 U  u( R
  r1 s4 W* k7 Y5 h; G* g2. 首先检测instance所在主机的状态是否为down,如果不是down(比如up),执行会出错。
, I4 N! V) {2 C; j7 qLOG.debug('vm evacuation scheduled', instance=instance)9 T3 k) z$ N% M2 V- A! w, T4 }
# 原实例所在主机
+ i7 n3 y. O, D& z* A3 Einst_host = instance.host& b1 u) j  n5 d5 x
service = objects.Service.get_by_compute_host(context, inst_host)2 c' h) b# n7 `" e
# 首先确保compute主机的状态为down& h  y' }1 h# h7 i2 g
if self.servicegroup_api.service_is_up(service):) Z" A8 n' k- z3 Q; N6 m4 i
    LOG.error(_LE('Instance compute service state on %s '% U# A9 N; H% g/ v& f6 x
                  'expected to be down, but it was up.'), inst_host)
0 f& o) U2 U: [# {& z7 g4 H; _    raise exception.ComputeServiceInUse(host=inst_host)
, m3 l9 S! L7 I7 K6 e: ~
0 z- F! T/ o4 F' ^3. 记录action执行操作
! W( {$ [2 [$ o# 实例的任务状态设置为REBUILDING
. t5 S- q2 e8 B; Q- G' kinstance.task_state = task_states.REBUILDING- Y+ @1 C0 y' R) b, E$ Q9 K' t
instance.save(expected_task_state=[None])
4 W  x; T$ Y0 x' w. j7 Y, Yself._record_action_start(context, instance, instance_actions.EVACUATE)
7 a% q. a; V+ t0 z+ u* R
- j0 V' k8 P. L4. 初始化迁移类
2 T/ E( |! F2 R: q- K, s; rmigration = objects.Migration(context,& s1 S, R+ V+ G, Z1 d- D
                              source_compute=instance.host,; e- K$ M& l. l7 j' F8 t
                              source_node=instance.node,1 t4 A( _6 P. p* ^
                              instance_uuid=instance_uuid,' d, A' m* b' M% Q
                              status='accepted',$ H$ K: r6 f: {) h: A
                              migration_type='evacuation')
" {1 R3 W" @6 U8 q5 J! A5 F5 \5. 创建迁移(这里为什么要创建migration,并没有执行迁移)
% o& H3 i6 b& v) q) m/ r4 Y( a# 如果提供了目的主机
; z4 s& [0 r6 h9 C# J7 U3 w6 lif host:; @* @( x. E/ \& s
    migration.dest_compute = host' Q) p1 Z; {% W8 P- P2 f! ]
migration.create()
1 H3 v! m$ n1 m: @9 u# V# F8 A1 b1 Y6 u" c0 Q
6. 发送消息通知实例的使用配额
0 R! K5 o! f  I6 Y  O0 ]compute_utils.notify_about_instance_usage(
& H' V8 ?- B- {- [# r; d% _" X3 T    self.notifier, context, instance, "evacuate")
$ \" B- H0 I8 v7 j
' `6 h, H6 }5 L7 L# J7. 最后执行task任务:rebuild_instance" _( `: S5 ^2 g
所以evacuate的本质是在新节点上执行rebuild操作
4 o- K8 D$ {: `& P9 [7 \return self.compute_task_api.rebuild_instance(context,5 P4 b! q  J: [* h: R% ~3 T
            instance=instance,+ Y& Z  B1 X) G$ x. D# R
            new_pass=admin_password,0 r# ^" Z  h! Y4 i2 f0 t
            injected_files=None,
, a3 j) o# i* A" U            image_ref=None,
) E9 O2 N, W. `% S1 c- `+ _: g            orig_image_ref=None,$ y3 F  q% }8 b
            orig_sys_metadata=None,
# k- c6 s7 k1 w            bdms=None,
- N& i1 S% u0 B0 E8 b9 l            recreate=True,+ ?% R' u5 g' H) V  P
            on_shared_storage=on_shared_storage,% H. z1 V& k+ g# _9 k, W! X
            host=host)
  X" d4 Z4 e4 m深入分析rebuild_instance方法,通过各种rpc调用,最终具体执行的是/nova/conductor/manager.py
" K8 L2 `3 B/ h! ?def rebuild_instance(self, context, instance, orig_image_ref, image_ref,& j* u0 z- w8 n, N! x
                    injected_files, new_pass, orig_sys_metadata,2 ?4 D$ r. C6 `
                    bdms, recreate, on_shared_storage,
7 G4 k, f/ f. I1 }4 ~                    preserve_ephemeral=False, host=None):
5 s0 n3 K* j1 Y4 u; c(1)在选择新目的主机时先排除instance所在主机
% |$ Z  `+ J5 P这样能确保不会在原主机上执行rebuild操作
: Z/ n' P6 H2 F7 W2 d! D1 n# 排除原实例所在的主机,即不能在同一个主机里进行rebuild3 D: t0 J+ n" l8 a, e# m
filter_properties = {'ignore_hosts': [instance.host]}' r( g8 v4 G+ S. x
hosts = self.scheduler_client.select_destinations(context,
: K  |/ f' k9 }% |1 E                                        request_spec,8 c" W7 C6 @3 s& B' e3 U
                                        filter_properties)
9 P% y/ Y$ S3 L: u& F! @(2)接下来会通过scheduler模块筛选出合适的新主机
/ W7 L1 s3 S% e(3)如果没有选出足够的合适新主机,则抛出异常8 f. s! w7 ]& f+ c* V
except exception.NoValidHost as ex:, @) H7 U* l/ @# _' g9 P
    with excutils.save_and_reraise_exception():
4 V# z" w7 C, g% q0 @# S        self._set_vm_state_and_notify(context, instance.uuid,: F3 ~* x' g3 [$ M
            'rebuild_server',
8 D9 ~& E( s3 i" d2 D            {'vm_state': instance.vm_state,$ ?' u- l  R, o8 a' F! M
            'task_state': None}, ex, request_spec)! V6 O# F1 r4 P% _9 [+ f
        LOG.warning(_LW("No valid host found for rebuild"),$ u. |( |# d$ {2 q# |& Q/ f
                    instance=instance)
+ V% Q8 t# h- ?1 i/ e/ y1 `不能选出合适的新主机,有可能是除了原节点外,其他节点都不可用(computer service status:disabled)或网络不通(computer service state:down),导致没有合适的新主机。
2 u& ]. A3 k) ^' I7 E# _% I6 Z+ a, O
# {8 F& y% y8 Z1 U- ?* U

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2021-8-30 17:36:52 | 显示全部楼层
前言: 因为机房服务器运行不稳定的原因导致计算节点挂掉,然后上面的Centos7虚拟机在迁移之后开机报错。这个解决方法同样适用于其它操作系统的虚拟机。基于镜像创建的虚拟机实例。
I/O error, can't read device /dev/vda 的报错信息
首先做疏散先把虚拟实例从宿主机上面疏散到其它主机,关闭云主机。
0 N) T* c2 K+ a1 j' P
1.找到虚拟机的ID可以通过dashboard界面或者使用openstack server list命令,找到虚拟机的ID;然后查看虚拟机的详细信息。
比如:
nova show 8fa3d2eb-2401-48a9-850a-f800314c6950# 与这个命令相同功能的命令还有openstack server show ID
连接到所在的计算节点,实例名称确定是哪台主机。
注意要主机是开机状态才能看到
通过ID可以确定该虚拟机实例的数据目录,如果openstack没有对接存储的话那么在这个目录下就会存在数据文件,因为对接了ceph所以信息在libvirt.xml的文件里面。
cat /var/lib/nova/instances/8fa3d2eb-2401-48a9-850a-f800314c6950/libvirt.xml 里面就是它的vda的ID。
2.当找到这个磁盘的ID之后,在ceph集群里面去查看这个设备
rbd ls volumes | grep 8fa3d2eb-2401-48a9-850a-f800314c6950
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
这个时候再重新启动就正常了。
( Y. W& v2 N# z* I2 V# ]$ Z6 e: g( O% A
您需要登录后才可以回帖 登录 | 注册

本版积分规则

返回首页|Archiver|手机版|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )

GMT+8, 2026-6-12 01:01 , Processed in 0.019488 second(s), 23 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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