易陆发现互联网技术论坛

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

openstack 疏散功能nova evacuate

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

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

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

x
[root@controller1 ~]# nova help  evacuate
( d1 _! ^* ~4 g6 ~6 D- ~usage: nova evacuate [--password <password>] <server> [<host>]
; [# U, L7 _/ w: j; T* MEvacuate server from failed host.
" I; C  E4 F) k3 u+ J, CPositional arguments:
' s9 O/ P" J* i/ u7 \- m; B7 J$ n  <server>               Name or ID of server.
% H3 {3 N2 `4 G8 Q  <host>                 Name or ID of the target host. If no host is
6 M: t* B/ L9 V8 c$ Z                         specified, the scheduler will choose one.% ^+ Q, Z% K/ B& v0 l
Optional arguments:: ]- w4 i( t. M* s
  --password <password>  Set the provided admin password on the evacuated
: A; S& _9 Z. y6 T$ h! O% R                         server. Not applicable if the server is on shared
" t/ Z! k! j7 G, o                         storage.' b1 D7 W0 d& U: ~# Y& W
 楼主| 发表于 2021-8-30 17:35:13 | 显示全部楼层
前提条件:! \. ^( D6 i& D' ]& I, ~
openstack和ceph集成完成,保证虚拟机系统盘运行在ceph上
" e1 n! O- f2 ?4 e8 }# T: ^
; R3 n! t( R0 M+ J  S配置步骤:
) c( a+ e, ^+ z, {* v1.在各个计算节点之间做root的ssh认证,可以相互免密登录0 j/ Q: W. A0 T" `" y" x

0 |: L  L$ E- M/ O" t" G; Q2.配置libvirtd服务修改配置
$ h' h) j, N: t3 c
( k$ l7 C' C  c$ ]7 _# vim /etc/libvirt/libvirtd.conf6 }7 v) L: C  Z4 r* G3 u9 X
3 M, L$ t: W* ^5 P
listen_tls = 0: E' L, l  W1 p" _1 F
listen_tcp = 1
2 N: e6 Z, L+ }9 H% B4 u% Cunix_sock_group = "root"' l5 P) t9 n6 G+ M5 v
unix_sock_rw_perms = "0777"
# U* n- \: I& p) _auth_unix_ro = "none"8 Z  M$ i; }" G# ^4 I3 H* T
auth_unix_rw = "none"% `' E9 t6 U1 P% T! ?
log_filters="2:qemu_monitor_json 2:qemu_driver"
: }4 {$ ]. L& O+ V' B) wlog_outputs="2:file:/var/log/libvirt/libvirtd.log"' d; l4 j8 B& ?
tcp_port = "16509". S/ Q+ {! u9 P5 _
listen_addr = "0.0.0.0"
. \) S; D6 s5 ?+ L, jauth_tcp = "none"9 \; W. G! a& l
修改配置
( T2 i+ f: C% ]/ t
, x; c3 y8 \2 j  v# \4 u, Gvim /etc/sysconfig/libvirtd * j" r+ u1 l4 f" f7 {( n- N
& T0 p% m# r5 o3 l4 ?4 G
LIBVIRTD_ARGS="--listen"
) z6 A. n1 ~% j. h#重启libvirtd服务
; Q$ w! X. b2 G# Y- i2 j9 T4 H5 ]0 E2 t+ y$ t4 j% S5 i
# systemctl restart libvirtd) q, }2 V; P& L, V
3.执行热迁移8 K$ g0 @; ?- x7 E! {

6 a1 Y' {, r* Q$ O( j7 r4 ^# openstack server migrate 3aa7f750-0867-43e8-accb-d2262ab99932 --live compute01( z- w+ j% }7 i' y2 x6 b
4.疏散步骤7 w- c: @' F" f2 ~0 i: ]
4.1 主机查询
' B/ Q5 `2 l9 _+ X- t- Q/ m3 b, P9 O  a. E% s
# openstack host list4 H9 Q6 U* |* \+ ?' _
[root@controller1 ~]# openstack host list
2 U/ F. `2 x  [, t! P+-------------+-------------+----------+' F4 |  F! s7 Z" F! j0 K) U% U
| Host Name   | Service     | Zone     |  e( R( a5 j3 k9 \4 Y* q
+-------------+-------------+----------+- T8 O3 [! }# k9 F3 |/ b" [
| controller2 | scheduler   | internal |
2 y& X/ e$ W9 ~| controller3 | scheduler   | internal |- E+ S2 L8 \  n+ z4 \
| controller1 | scheduler   | internal |$ E8 N% w6 `; V& Q5 |
| controller3 | conductor   | internal |- m$ S6 Q/ S: ~5 V
| controller1 | conductor   | internal |6 R6 _% h0 G3 e% H) o6 t
| controller2 | conductor   | internal |. O9 n9 @# y4 v" t# a0 D" j
| controller2 | consoleauth | internal |
8 }0 i: S! ^- N2 R2 ^; G| controller1 | consoleauth | internal |- h8 o/ _9 N6 [9 H* Y
| controller3 | consoleauth | internal |
; X# \: {# S, M0 L& Y. ^| compute02   | compute     | nova     |7 [7 @$ W2 N; q+ k5 ~! _, w: g
| compute03   | compute     | nova     |
" N% ^4 E1 {& \' `  N, u# w9 E| compute01   | compute     | nova     |
( B( O; O) s/ q6 y4 F- _2 I+-------------+-------------+----------+5 t/ W9 W# ]8 m1 l

/ U: U. d& s# u1 r$ r: e$ {# {: J
; i. Q( `4 t) L; {4.2 执行疏散9 G( O3 u# F& ^& W" Y

' c' o+ h& g% C2 C! p7 ?3 i6 A8 H一台计算节点的所有虚拟机疏散到另外一台计算节点# Q/ w9 c3 ?0 J& t0 ]
0 v! ~: m  i$ r. M& V

( v/ M) ?' Z1 b  k  S1 M9 l8 t: w: O/ e$ ~
# nova host-evacuate --target_host compute02 compute011 K& |8 a# D- c: v; T6 j. e
一台计算节点上的一台虚拟机疏散到另外一台计算节点
  K: @" q7 v/ r- `! K/ {6 G- Y6 g1 b
# nova evacuate 3aa7f750-0867-43e8-accb-d2262ab99932 compute02
2 }# C* t( h7 `" Y
  p, o& q* }1 @4 ?: t3 D% ]
# u+ w8 @; ]3 T" e& O9 _9 ~# f8 O[root@controller1 ~]# openstack host list
0 ^1 v- S9 l4 _/ @+-------------+-------------+----------+% r+ h: C: {9 T6 ~+ w% b7 w
| Host Name   | Service     | Zone     |
0 `5 D% k# _% S( o  E1 \+-------------+-------------+----------+5 L, w7 Y8 l5 h& k
| controller2 | scheduler   | internal |' J1 m+ `4 o1 f3 n9 J: `* h+ _
| controller3 | scheduler   | internal |
: e/ V- t5 H. @% E| controller1 | scheduler   | internal |
0 ]+ Q5 Z& E7 _) X| controller3 | conductor   | internal |4 r+ G* L( i; G, f
| controller1 | conductor   | internal |
$ |" o* K6 B: w( f* a| controller2 | conductor   | internal |9 X  k# ~3 f1 j5 D. J
| controller2 | consoleauth | internal |
+ @" @7 E$ {, g  Q( b! O6 K| controller1 | consoleauth | internal |  G- g9 R. q/ g$ d' J( y* W1 D
| controller3 | consoleauth | internal |
8 s. ^7 t* N0 t& p- ?3 _| compute03   | compute     | nova     |
' Y& F8 m* u# W+ W& h- p| compute01   | compute     | nova     |
3 U! a0 a: ]6 y# T4 g$ C+-------------+-------------+----------+
& {# u% z: u6 R- X
2 \! `" I: n: j* \! ?[root@controller1 ~]# nova host-evacuate --target_host compute02 compute01
2 i& Z# u# ^- {; \+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
" ^+ m5 S- i* n6 R: v+ m| Server UUID                          | Evacuate Accepted | Error Message                                                                                                                                    |
& s4 ], V; H2 c- L+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+5 G) N9 |2 d# W: D0 Q
| 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) |6 f7 E# h. w! F3 B" O0 I+ _) C8 W
+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+3 _. B* a/ Z) Z9 _
[root@controller1 ~]# nova host-evacuate --target_host compute02 compute03' \/ s, B/ i( ~; z
+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
; A+ L$ K$ _3 Z3 C; B5 @3 L| Server UUID                          | Evacuate Accepted | Error Message                                                                                                                                    |
: |$ B( r" B6 }+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+5 B+ L. U; f4 h+ G' K# o
| 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) |
+ @9 d% E9 a" y& z5 L+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+; ^2 o" s% ?/ V3 X6 q8 M
, h, k0 X2 I8 a9 x) T
[root@controller1 ~]# nova list / N0 g* u# S' S/ O
+--------------------------------------+----------+--------+------------+-------------+-------------------------------------+6 B, @, e3 g: L' X7 s
| ID                                   | Name     | Status | Task State | Power State | Networks                            |, R( A7 d# k& m' {# ?
+--------------------------------------+----------+--------+------------+-------------+-------------------------------------+
: v& u3 W" K1 |2 u; Z% R| 7b01d71a-40d4-45fa-bf5c-97e676b2b9a2 | test1    | ACTIVE | -          | Running     | bridge=192.168.0.206, 192.168.0.233 |
  g$ p; a" N4 |% E; Q' Z| 590e3822-085b-4273-bce1-bf0e7a09b9f7 | zhangyj1 | ACTIVE | -          | Running     | bridge=192.168.0.223                |8 n& M" U3 W" e7 k; G
| 347d5d2e-1516-41ef-b247-a42bc72e093c | zhangyj2 | ACTIVE | -          | Running     | bridge=192.168.0.201                |
# @0 o$ R1 V, m5 T& D! N3 @+--------------------------------------+----------+--------+------------+-------------+-------------------------------------+* A' ?$ k/ t# A' r. u! F* O
[root@controller1 ~]# nova evacuate  7b01d71a-40d4-45fa-bf5c-97e676b2b9a2 compute030 {0 c$ I' m) S0 v6 o" b
[root@controller1 ~]# nova list - E8 t- }5 Y/ P$ R+ C
+--------------------------------------+----------+--------+------------+-------------+-------------------------------------+
/ X; k2 q4 k$ E- l: i) V: P( F| ID                                   | Name     | Status | Task State | Power State | Networks                            |  T6 _' C8 x- L4 p$ X+ |
+--------------------------------------+----------+--------+------------+-------------+-------------------------------------+/ n; H4 P( Q( j! E
| 7b01d71a-40d4-45fa-bf5c-97e676b2b9a2 | test1    | ACTIVE | -          | Running     | bridge=192.168.0.206, 192.168.0.233 |3 f* p5 K8 e# ?  z& Y
| 590e3822-085b-4273-bce1-bf0e7a09b9f7 | zhangyj1 | ACTIVE | -          | Running     | bridge=192.168.0.223                |
) k2 o5 w* k. ~9 c3 Y" z* ]| 347d5d2e-1516-41ef-b247-a42bc72e093c | zhangyj2 | ACTIVE | -          | Running     | bridge=192.168.0.201                |
: j2 M( `3 z/ I$ R8 L+--------------------------------------+----------+--------+------------+-------------+-------------------------------------+6 s: L  }4 z: I6 i) X
[root@controller1 ~]# nova show 7b01d71a-40d4-45fa-bf5c-97e676b2b9a2
7 ^( a% Y& Y7 q3 I2 Z8 Y+--------------------------------------+----------------------------------------------------------------------------------+3 t0 S! D* I6 T$ l, F; a
| Property                             | Value                                                                            |! n/ p. o. m3 B  P$ b  c6 o! j
+--------------------------------------+----------------------------------------------------------------------------------+
, |3 }( _- J! z0 T) @& B1 a| OS-DCF:diskConfig                    | AUTO                                                                             |$ U9 j8 n( G2 J( d" m) t
| OS-EXT-AZ:availability_zone          | nova                                                                             |9 ~3 J0 s1 c5 I9 c" r+ F0 H4 W
| OS-EXT-SRV-ATTR:host                 | compute03                                                                        |
) l0 m# L, a, q$ \* |* I| OS-EXT-SRV-ATTR:hostname             | test1                                                                            |
' d2 E+ n& {- ]0 k! o: \| OS-EXT-SRV-ATTR:hypervisor_hostname  | compute03                                                                        |
; V2 e5 p& }  [| OS-EXT-SRV-ATTR:instance_name        | instance-00000002                                                                |% W0 a( u1 Y, W  J7 f
| OS-EXT-SRV-ATTR:kernel_id            |                                                                                  |
. e+ G" U1 l+ ~$ d2 A; e$ ?| OS-EXT-SRV-ATTR:launch_index         | 0                                                                                |
8 i- X5 q7 P  L8 P| OS-EXT-SRV-ATTR:ramdisk_id           |                                                                                  |
& h4 i8 Z0 D# h3 Q# || OS-EXT-SRV-ATTR:reservation_id       | r-uqofhf0v                                                                       |9 O' P* ?7 n" W  q
| OS-EXT-SRV-ATTR:root_device_name     | /dev/vda                                                                         |
4 b7 ^6 s6 M+ g: B& h  a# s- u| OS-EXT-SRV-ATTR:user_data            | -                                                                                |) d# J0 Y6 p% e& h% k4 [
| OS-EXT-STS:power_state               | 1                                                                                |! c, c& Q  i+ U4 s! C; u2 o
| OS-EXT-STS:task_state                | -                                                                                |/ m1 v4 H9 |0 \/ P
| OS-EXT-STS:vm_state                  | active                                                                           |
/ }7 J+ s: c8 c| OS-SRV-USG:launched_at               | 2021-08-31T01:25:16.000000                                                       |
% C  k' m" ]! c5 x' i  p| OS-SRV-USG:terminated_at             | -                                                                                |
5 d3 J* [  a5 ?# M9 V' t| accessIPv4                           |                                                                                  |
/ O4 ]% L2 L- ]0 ]  n| accessIPv6                           |                                                                                  |7 V5 w! g8 T/ J6 J1 \0 S! [' b1 k
| bridge network                       | 192.168.0.206, 192.168.0.233                                                     |
8 q% {* |7 {! U& Y| config_drive                         |                                                                                  |
3 T+ F. @- r( J* N' n* F* D/ p| created                              | 2021-08-25T07:37:43Z                                                             |5 `$ d, k3 l! b* B$ v
| description                          | -                                                                                |' z5 q# D9 i. \) N0 E6 @) n
| flavor:disk                          | 10                                                                               |
; G3 J% [' t( D" F/ q4 U| flavor:ephemeral                     | 0                                                                                |; E) ~" @' R% S. p
| flavor:extra_specs                   | {}                                                                               |
, c0 r& D& s: H8 V9 E8 v6 I8 r9 s& l0 ?' R5 @| flavor:original_name                 | type-1c-1g-10g                                                                   |  o% M3 n9 A3 N8 j1 ]- J& y
| flavor:ram                           | 1024                                                                             |
  y9 N8 Q+ g& G1 h| flavor:swap                          | 0                                                                                |- h% d& w" x$ _
| flavor:vcpus                         | 1                                                                                |
4 e, O2 o7 M# I( k. \' Y/ V6 E8 a; [| hostId                               | 35bcc54020d6ae54aebe586983a9df9d8562a0201cea0c0d85e39455                         |
! i3 z! G+ j' d) @5 K| host_status                          | UP                                                                               |
) D( T+ o$ v8 m| id                                   | 7b01d71a-40d4-45fa-bf5c-97e676b2b9a2                                             |( D- J; n) z8 T
| image                                | Attempt to boot from volume - no image supplied                                  |
4 I( J' {6 `& J* p| key_name                             | -                                                                                |- z5 m" {* s+ H2 p% F4 |. u
| locked                               | False                                                                            |) b& m+ B) f; o# G4 a
| metadata                             | {}                                                                               |
& m' ]5 }' k! J3 f* @2 N| name                                 | test1                                                                            |
* z' h/ J% A0 I8 F) ]| os-extended-volumes:volumes_attached | [{"id": "d385a405-529b-450e-98e7-44aad0d3e94a", "delete_on_termination": false}] |+ V' o2 Z, ^3 F; r
| progress                             | 0                                                                                |
- v' |- F3 T" W7 I- z& z+ ^% X| security_groups                      | default                                                                          |1 K) k4 ~6 k- C) b
| status                               | ACTIVE                                                                           |$ R3 F& w) I; o6 U
| tags                                 | []                                                                               |
+ M# L6 y3 i: \) e* i  _! ~. D2 R" p| tenant_id                            | 92a5a26fc14d418d881ade0ccbcffc59                                                 |
: v6 I7 E3 D7 J( Y" w| updated                              | 2021-08-31T01:25:17Z                                                             |
4 m  l1 y5 ]& w3 E8 A5 N3 V4 ~| user_id                              | b1ffbc1f84cf42c99a8e59fdaf7f1cf5                                                 |5 p3 t+ N% n: Y# {0 i& e% D( ~: R3 C
+--------------------------------------+----------------------------------------------------------------------------------+9 h! S5 L  O' C0 f1 d+ s% N. w6 m
————————————————1 k% z8 \2 ]0 X/ D0 y; ?: o' o

1 E! Y) s3 \" V% v# P) n( Z. M, u+ p# d4 K9 e
 楼主| 发表于 2021-8-30 17:35:43 | 显示全部楼层
一. 当实例所在的节点发生故障不可用时,可执行evacuate操作,在另外一个新节点rebuild该实例,实现高可用。
. s* H2 p+ Q3 b: n- L) X' i这可以是OpenStack计算节点HA的一种实现方案。$ p' c0 C8 {+ o# Y

# c% k. P- D" ~% r) k二. API调用
. i/ Y$ J1 v. x+ g( _nova.servers.evacuate(server=fm['id']), on_shared_storage=True
) K& c8 g: V/ I' @9 u8 @* B# v1. on_shared_storage参数在2.14版本后废除,自动检查是否为共享存储。
& E# c- P9 @- }$ ^% w4 Z    共享存储能够保证实例在另外新节点重建后数据不丢失7 u4 B4 Q9 x  q; s4 O6 H, w! M
2. 可以设置目的主机host
/ h3 Y8 j$ u) A, a5 ^& Z# t    如果不设置host,nova会通过scheduler选择一个新的主机(不会分到原主机,因为rebuild函数中过滤了原主机), w% I/ s) L' Y! F- n
3. 这个调用只是发送了evacuate操作命令,具体是否真正疏散成功,无法知道
( P0 {1 O: g: Y6 a. `
5 ~. c3 j3 z6 A. ]: @: N三. 源码分析
3 \8 Q2 X3 e/ v8 m2 A, j对应的是/nova/compute/api.py
- V0 {( P/ B& w6 x& A4 `@check_instance_state(vm_state=[vm_states.ACTIVE, vm_states.STOPPED," q) E7 k  ^$ N2 ?; w/ y$ q) ?
                                vm_states.ERROR])' p4 M* K5 P. [6 M
def evacuate(self, context, instance, host, on_shared_storage,
/ o# d) m7 _' y8 V. O            admin_password=None)0 Q) t* t& }  T) |
1. 函数上方有装饰符 @check_instance_state
3 N8 P, R  a. M表示在执行evacuate方法前先执行check_instance_state:检测传入的instance的vm_state是否为ACTIVE、STOPPED或ERROR。如果不是这三种状态,不能执行evacuate方法。# b& p) P  E  J4 W. i9 @7 a/ |

+ {- W: d  j) m; j7 b* o2. 首先检测instance所在主机的状态是否为down,如果不是down(比如up),执行会出错。
% s& Y1 A, m: n7 ELOG.debug('vm evacuation scheduled', instance=instance)
0 G; z0 f" j+ n  M$ g5 D# 原实例所在主机
" b% V; f  }/ h5 l$ l! K, ^inst_host = instance.host
* J6 d1 s) `9 K& E* i( K8 Wservice = objects.Service.get_by_compute_host(context, inst_host)
$ F* w9 }/ S( O6 p% r" \# 首先确保compute主机的状态为down: _. E  x& m" D  f2 U6 w  Z
if self.servicegroup_api.service_is_up(service):
0 @9 @5 E4 V  I; ]* Q- \    LOG.error(_LE('Instance compute service state on %s '/ F; _  `: C& b( h1 ]; a: s
                  'expected to be down, but it was up.'), inst_host)
( I' _. ^1 ]. _" D    raise exception.ComputeServiceInUse(host=inst_host)
2 G) m7 B( S" f$ n' p& ?" F5 [/ u, y& g6 W) @/ p4 ?
3. 记录action执行操作
/ {" u& X* y! `+ V. y- y6 ~# 实例的任务状态设置为REBUILDING
8 x: x+ H- C1 o4 q# @* Kinstance.task_state = task_states.REBUILDING4 B9 m0 ~) q- B$ P$ p
instance.save(expected_task_state=[None])$ N% s2 p% `" x. }
self._record_action_start(context, instance, instance_actions.EVACUATE)
9 J, Y3 E3 _6 [& b: ~" [& w
$ N. s. j  O5 H6 ^4. 初始化迁移类
9 L6 D( c4 y' D! r: B) T' f! x# nmigration = objects.Migration(context,$ e1 M* ^. \, A* H9 H( W, @: R
                              source_compute=instance.host,7 G* {. i+ B0 Q
                              source_node=instance.node,
% x# `: J" S8 H4 V' t& C. ~                              instance_uuid=instance_uuid,
. A# A+ [, p% f                              status='accepted',
  N/ P% G* x7 y% y                              migration_type='evacuation')7 U- T7 y4 ?+ e/ j- F
5. 创建迁移(这里为什么要创建migration,并没有执行迁移)  B. d( k' E8 W& g# H5 |% H
# 如果提供了目的主机& }' m1 F9 d) I7 i$ a6 _* }
if host:# q0 w! A8 [  P7 C! \( Z0 x+ W
    migration.dest_compute = host
! G" @& Q4 P3 f. J; E7 C& qmigration.create()* u. X8 h6 e. Y% {

/ j4 q" L7 D2 c3 u% S1 l4 O, g6. 发送消息通知实例的使用配额
/ q4 r$ E7 h3 O8 o' C8 V7 a8 Kcompute_utils.notify_about_instance_usage(  u. u! P$ R3 G' }. W( f5 @
    self.notifier, context, instance, "evacuate")
& t. H0 K" D, }) u% ?. c) R7 U* p* d  H
7. 最后执行task任务:rebuild_instance2 e; T" C6 q; n* W& S
所以evacuate的本质是在新节点上执行rebuild操作
' Q: v. b7 V0 Z% yreturn self.compute_task_api.rebuild_instance(context,& m% n, i& ~; V0 P! l
            instance=instance,' k! G6 L" r  t; ^! D% Z
            new_pass=admin_password,
/ B1 V6 h. v) B3 @2 U            injected_files=None,
6 O. u# v/ J0 y- W            image_ref=None,
8 ?! ]  i* `% W5 n% W            orig_image_ref=None,
4 V4 c# ?) ^$ r6 ]: v! z            orig_sys_metadata=None," X. w$ C0 m5 e5 T6 M
            bdms=None,
" H# k/ \8 S1 Y; l2 ~0 X8 l' {+ z            recreate=True,
/ U& w1 N( x7 G( g4 u& L            on_shared_storage=on_shared_storage,
8 [0 m$ s0 X8 k  L! V5 |            host=host)
+ q/ t! S" f4 g$ Y深入分析rebuild_instance方法,通过各种rpc调用,最终具体执行的是/nova/conductor/manager.py) {; B. ?4 Q# b0 s) H; f3 p1 ^
def rebuild_instance(self, context, instance, orig_image_ref, image_ref,# t* {. Y9 w6 f( |0 r5 h) ~( P
                    injected_files, new_pass, orig_sys_metadata," z6 B1 }' }. l: T3 e) P/ l
                    bdms, recreate, on_shared_storage,/ u5 c. E3 M; y! X
                    preserve_ephemeral=False, host=None):
4 H5 e) v4 F6 F3 m2 x  o* ?(1)在选择新目的主机时先排除instance所在主机9 J+ I* p3 y/ r- P
这样能确保不会在原主机上执行rebuild操作% t9 G- _! |3 s* U
# 排除原实例所在的主机,即不能在同一个主机里进行rebuild
9 V( h; O3 K) v1 q8 u7 Jfilter_properties = {'ignore_hosts': [instance.host]}) n' ?8 L# y! C( P% E- T
hosts = self.scheduler_client.select_destinations(context,) n1 A& y! g2 l
                                        request_spec,; o+ N4 @9 m; r+ o
                                        filter_properties)7 z. S/ a7 V+ k# [$ q+ w- Y" t
(2)接下来会通过scheduler模块筛选出合适的新主机
# O$ U2 L, b7 m+ Y- e(3)如果没有选出足够的合适新主机,则抛出异常
8 L+ V( e( C2 c  l% J" {except exception.NoValidHost as ex:7 {  F4 T: e5 F- v# D
    with excutils.save_and_reraise_exception():+ }* J0 T! m' U1 t7 R6 J
        self._set_vm_state_and_notify(context, instance.uuid,
; |' ]+ E8 t+ d! t. P. x* y3 T            'rebuild_server',; @+ ?7 r" ?5 O/ R! C4 x( R4 b  O
            {'vm_state': instance.vm_state,, H. U2 |4 q/ ~; V/ K% t
            'task_state': None}, ex, request_spec), |& Y  B5 _0 V, u! E6 ?- X
        LOG.warning(_LW("No valid host found for rebuild"),# C9 ^, u! h6 [- ]  r0 a- s! s
                    instance=instance)9 w, ^& g: T! E8 g. c
不能选出合适的新主机,有可能是除了原节点外,其他节点都不可用(computer service status:disabled)或网络不通(computer service state:down),导致没有合适的新主机。
, R0 p/ n6 A4 W2 d" f
% `/ C! q3 k+ f; H& j# P- N
 楼主| 发表于 2021-8-30 17:36:52 | 显示全部楼层
前言: 因为机房服务器运行不稳定的原因导致计算节点挂掉,然后上面的Centos7虚拟机在迁移之后开机报错。这个解决方法同样适用于其它操作系统的虚拟机。基于镜像创建的虚拟机实例。
I/O error, can't read device /dev/vda 的报错信息
首先做疏散先把虚拟实例从宿主机上面疏散到其它主机,关闭云主机。

# f  K  S. `; ^, S0 H! X& I
1.找到虚拟机的ID可以通过dashboard界面或者使用openstack server list命令,找到虚拟机的ID;然后查看虚拟机的详细信息。
比如:
% S1 K% J) _/ Y$ {( |7 Y/ {
                               
登录/注册后可看大图
nova show 8fa3d2eb-2401-48a9-850a-f800314c6950# 与这个命令相同功能的命令还有openstack server show ID

! D( b4 s; x: ?: V7 X                               
登录/注册后可看大图
连接到所在的计算节点,实例名称确定是哪台主机。
注意要主机是开机状态才能看到
6 ]+ v' V; |! ]0 D
                               
登录/注册后可看大图
通过ID可以确定该虚拟机实例的数据目录,如果openstack没有对接存储的话那么在这个目录下就会存在数据文件,因为对接了ceph所以信息在libvirt.xml的文件里面。
' D) [8 B9 W; b5 X- n
                               
登录/注册后可看大图
cat /var/lib/nova/instances/8fa3d2eb-2401-48a9-850a-f800314c6950/libvirt.xml 里面就是它的vda的ID。
$ S! \2 G. p+ ?, G. u* M
                               
登录/注册后可看大图
2.当找到这个磁盘的ID之后,在ceph集群里面去查看这个设备
rbd ls volumes | grep 8fa3d2eb-2401-48a9-850a-f800314c6950

# M1 b" @9 M" h                               
登录/注册后可看大图
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
这个时候再重新启动就正常了。6 u: U9 x& t, W7 d+ ~3 e( @
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

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

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

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

GMT+8, 2026-4-8 21:25 , Processed in 0.053389 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

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