|
|
多台虚机需要使用组成高可用模式,需要在openstack里配置一个虚ip对外提供服务。由于keepalived使用的是VRRP协议,所以还需要在配置高可用的虚机安全组放开VRRP协议的规则" L: ^* ], u+ f# J' ]/ y/ k
环境$ A8 V! U) ?3 e9 `
主节点: 192.168.0.1869 m8 e' j* P& [* y
备节点:192.168.0.187' e! p/ ]' d+ D: f% }
VIP: 192.168.0.230
2 u' {4 c; g$ j* ^4 x& h) b* F创建虚IP
# s( r' @# o, I% W' h直接在控制台导航:管理员-系统-网络,点击虚机所在的网络名称,进入详情页面,然后点击创建端口按钮,在弹出的窗口,填入名称(eg: my_vip)。在该详情页可以看到该端口对应的固定ip,后面会用到该IP
! f& z0 |: _0 f, o) i; m5 P虚拟机启用VIP
0 G7 K% x! U* u1 O% c' e4 A( ?+ ^在控制节点执行:5 c" c" p9 N6 g: w+ _2 p1 @
) s+ [% R2 x- Q, h1 I7 ^neutron port-list|grep -e 192.168.0.186 -e 192.168.0.187 # 根据虚拟机IP获取port_id" s9 k# a/ g0 K* m; S: @% Q* W
G% e y' M S: h! l3 M9 ]/ ^neutron port-update PORT_ID --allowed_address_pairs list=true type=dict ip_address=VIP # PORT_ID为上一步获取到的port_id,VIP为前面创建的虚ip: b9 ~" o: n: `4 B% M
9 w2 M( J7 X$ y0 n$ P$ `
$ Q2 t' J( t8 F; _5 ]
有几台虚机,就重复几次执行 1、2 步骤& }; W+ P2 c! q: O
安全组允许VRRP协议
0 q# q/ U8 F S& v7 `( G& P直接在控制台导航:项目-访问&安全,搜索虚机所在的安全组, 然后点击后面的管理规则按钮进入规则列表;点击添加规则按钮,弹出框里,在规则的下拉选里选择 其他协议, 然后再 端口 文本框输入 112, 最后点击添加按钮即可 # VRRP协议的端口号是1128 [+ I7 F8 K, t8 W0 n
配置keepalived, u8 N, s f: \: K6 k
安装4 z6 D6 J% c: r3 T, ^7 v0 j( E$ s
yum install keepalived nginx # 我们通过nginx服务来验证虚机服务的切换# ?2 F( P' P: _3 H4 d
配置" a1 |" F6 ~2 H0 y1 h' \) S
主节点:
/ f4 I% M0 k6 wcat /etc/keepalived/keepalived.conf
* k; h! G3 t9 e P8 y2 R! Configuration File for keepalived" i/ h" I: R) p& h$ r6 u
global_defs {
5 S3 I. V1 A* c- ^8 t: S router_id LVS_DEVEL
# h& p8 M1 ?% m5 L# c5 l}# k( E) l% F" ^" e* M" `. G
vrrp_script check_nginx_alive {
+ g# L% Y1 @3 x% X) \7 s+ w! S script "/etc/nginx/check_nginx_alive.sh" ## 检测 nginx 状态的脚本路径" b$ m# u) q$ W
interval 3 ## 检测时间间隔
P% r. L/ p! R- a6 T( }$ S4 ? weight -10 ## 如果条件成立,权重-10
$ x+ P" T, e& y/ A: }: D}
1 R* `5 H2 c' ^: F9 ~4 m+ {! Qvrrp_instance VI_1 {
: y/ l4 f Z! o; [; `2 n! X! y state MASTER # 主节点,备节点为BACKUP2 f: h! x% u I: N, a
interface eth0 # 绑定的网口5 b- x3 T- R4 l% {, M1 ~1 t# j2 g
virtual_router_id 51 # 准备节点一致
3 _! Y3 j, h; `6 I& O( o$ | priority 100 # 权重,备节点要比主节点低
! T, {6 H8 A8 W7 _4 f4 i advert_int 1
' T4 g- i4 `6 p% [ authentication { # 认证信息,准备需要一致
, o. F% h! k2 c. `1 `0 _2 S auth_type PASS
C8 W# o# j. C" a auth_pass 1111' S% ~6 b+ q' F5 Q( Q6 N
}+ d( E( s2 v/ C" D
virtual_ipaddress {
3 p# N1 G, p- H) j8 N9 E# r 192.168.0.230 # vip,可以多个,每行一个
* `) H; N4 e' y8 _8 m( g6 z7 J0 n }
9 B: D( x& t# q! `6 f track_script {6 O7 c" S+ J" b5 K d0 C
check_nginx_alive # 服务检测脚本
5 ]9 v9 H7 D: u }
% [5 I8 C; ^' y! O4 i" ^( M6 g}
- y: A8 x9 d i A; ]' L% p* E" Kvirtual_server 192.168.0.186 80 { # 配置虚ip以及访问的端口
3 `; g4 _+ t8 c* M; x: k delay_loop 6
6 ]! J3 @1 o$ ~8 n8 T lb_algo rr
8 _+ A, O; G' a% _9 b, N lb_kind NAT; o# `0 p! U$ p4 w0 _, y. C, {
persistence_timeout 50$ U" i8 T+ n6 T' v& @
protocol TCP
) p y0 E8 ]2 q real_server 192.168.0.187 80 { # 虚机真实ip及访问的端口
0 R' o( \! Z! F" c! ~ weight 1- b. I# S( R' ~& O9 |2 g
TCP_CHECK {
3 K3 [, A1 x# V& | connect_timeout 3
9 w9 l' |+ O# |3 ]/ h1 {; m nb_get_retry 3# V- i0 U+ U/ h# ?
delay_before_retry 3, N. f9 w9 M* h8 H/ Q; E
connect_port 80# h j8 ~7 w; w/ ~3 O1 e O
}
( c, ~0 u& B+ Y5 S0 w }
1 T+ Z+ P- r6 X2 @3 D; h3 @" s}$ s6 i4 Q2 X4 N$ k' ^) ^
echo -e " 192.168.0.186 nginx-master" > /usr/share/nginx/html/index.html
: O, f* h$ u6 J* `3 }$ k# V备节点
0 f* ~6 n, p% _# ^0 s: T' l: Y1 A! Configuration File for keepalived
" F3 E! W. {$ A/ l- b( Rglobal_defs {# j! n5 _! P% Z' L9 l! r' k
router_id LVS_DEVEL- B( o; f7 C, `4 p# h: K; b
}
% X% \6 b6 W: |vrrp_script check_nginx_alive {; }( G0 c6 V" D) c+ ]5 ]% f
script "/etc/nginx/check_nginx_alive.sh" ## 检测 nginx 状态的脚本路径( K- y* U% {7 H" ^1 r
interval 3 ## 检测时间间隔
: S1 j, x4 d+ f9 j/ P' r; f5 `2 l weight -10 ## 如果条件成立,权重-10
: _9 ^3 D- X" h4 Q4 x% h}
( Z, t+ y b; l) z9 Q9 rvrrp_instance VI_1 {7 m! n# g. H3 l* T# E
state BACKUP" \: ?: `# D+ L/ c# R/ }3 G" r
interface eth0) }& w% Z5 D5 T9 N
virtual_router_id 51' n$ l% O& a3 S2 ]
priority 98
% z7 y' l( m% ?5 ^) |1 O advert_int 1
; x: j6 \4 b# o7 S" w/ }* ^7 E authentication {& m3 h9 t5 A: W& t8 n
auth_type PASS" Z" M1 ?9 K U, S
auth_pass vip_test
. T9 }# Y' @! I# ]- S }0 Z) Z1 ~5 x/ g4 w7 q8 P: L7 i
virtual_ipaddress {
3 y& z( F5 p& P' Y2 c 192.168.0.230
% Q; a/ v8 I# n; y, ]" |3 f }) S4 m' g& Q' S
track_script {; r8 g& B$ ~" d
check_nginx_alive( ?& P N( ?% W* z- n x
}
8 G* d4 Z4 w8 L}( k! h3 n) e* w
virtual_server 192.168.0.186 80 {
, Q$ ]6 r7 Z: x7 z$ L delay_loop 6
" M9 K: v$ W# ?+ L* [ lb_algo rr- W* ?, |) a7 Q( ~
lb_kind NAT
9 F- r& a2 e M3 J% e; \* [ persistence_timeout 50
' U, E/ c3 t7 Z5 O- H( i protocol TCP
2 P# d! r. @. a3 ?3 [& ^4 g real_server 192.168.0.187 80 {6 c0 b% o- x- O6 d$ X, M
weight 15 a) \4 ?' e' o$ [1 V: S
TCP_CHECK {
( u+ y$ I8 T8 m3 B! ^ connect_timeout 3
2 {2 g1 Y8 f" m nb_get_retry 3" z0 Z9 R9 G( W8 e$ j1 C
delay_before_retry 3
$ k. }; I6 R/ W8 a' B8 k; t4 v connect_port 806 M0 c) t! \. c6 q* [
}1 p# P z a- u* d. X" n _5 e2 Z
}
% K5 V: L' m5 [+ c5 y}0 O8 i+ C7 l1 q/ M& ~# u# h
echo -e "192.168.0.187 nginx-backup" > /usr/share/nginx/html/index.html
; x, T+ P2 K' h3 }6 E. b主备节点添加服务检测脚本' {& \3 T$ w1 [% f
cat /etc/nginx/check_nginx_alive.sh
8 M# g7 S) v: p! S#!/bin/bash
0 O0 {- E4 k, |4 sA=`ps -C nginx --no-header |wc -l`: Z3 u* l" G8 u9 H
if [ $A -eq 0 ]# w1 v9 h! ^5 r2 J) O
then echo 'nginx server is died'' h: U! z" B; S, _( L# y6 i
systemctl stop keepalived
. m% \7 W9 ] a0 V" Ufi; K5 ^5 R0 V. l( P& h. f
chmod +x /etc/nginx/check_nginx_alive.sh
) I' ~ R$ m7 [主备节点启动服务, q4 i. ~ |5 z( W! b1 Y) n
systemctl start nginx
6 I, x1 z) B! P* r+ F* q, R9 |+ Q: csystemctl start keepalived5 n' C/ Q; P, {7 _( ~
我们通过浏览器访问:192.168.0.230,显示的是:192.168.0.186 nginx-master, 主节点0 F( i8 Z- u6 s
把主节点的keepalived服务关闭:systemctl stop keepalived, 浏览器再访问192.168.0.230,显示的是:192.168.0.187 nginx-backup,切换到备节点4 R+ p- n+ R, B/ M9 G5 B9 u
再把主节点的keepalived服务启动:systemctl start keepalived,浏览器再次访问:192.168.0.230,显示的是: 192.168.0.186 nginx-master,已经切回到主节点
- O) a `( Q9 t$ W9 e |
|