|
|
多台虚机需要使用组成高可用模式,需要在openstack里配置一个虚ip对外提供服务。由于keepalived使用的是VRRP协议,所以还需要在配置高可用的虚机安全组放开VRRP协议的规则
3 ~; p5 F- E7 d* J `环境- y, D2 O( \/ A% X
主节点: 192.168.0.186$ K$ R. x: f t& a6 n: e% N
备节点:192.168.0.187
# c- Y1 w; t' ~) |9 V3 p8 mVIP: 192.168.0.230
8 o/ R; X! k+ w' z: r# B0 q创建虚IP4 w; z- Z1 ]7 L% T
直接在控制台导航:管理员-系统-网络,点击虚机所在的网络名称,进入详情页面,然后点击创建端口按钮,在弹出的窗口,填入名称(eg: my_vip)。在该详情页可以看到该端口对应的固定ip,后面会用到该IP4 [9 ]6 ^3 s) L
虚拟机启用VIP% B5 W; g5 l7 _; q' h
在控制节点执行:2 g. R4 S8 w2 y9 o. k0 r
$ n" g& u- T# ]8 s# F
neutron port-list|grep -e 192.168.0.186 -e 192.168.0.187 # 根据虚拟机IP获取port_id+ e& L3 d+ E2 ?$ A4 ~
0 `# R, I2 W. ?4 {3 t9 S8 d
neutron port-update PORT_ID --allowed_address_pairs list=true type=dict ip_address=VIP # PORT_ID为上一步获取到的port_id,VIP为前面创建的虚ip
' E: V; }3 \6 [ z) B! y, s4 Y
, T0 h$ s- N6 I! ^, p
, b* C) o0 D9 @. x6 h3 `5 m有几台虚机,就重复几次执行 1、2 步骤$ g4 F5 L* i8 ^) B( ]% B9 w* Y0 W' R
安全组允许VRRP协议
' s: V# v3 ~, [; R, P/ \直接在控制台导航:项目-访问&安全,搜索虚机所在的安全组, 然后点击后面的管理规则按钮进入规则列表;点击添加规则按钮,弹出框里,在规则的下拉选里选择 其他协议, 然后再 端口 文本框输入 112, 最后点击添加按钮即可 # VRRP协议的端口号是112" G5 B3 R2 |" G5 p y# |
配置keepalived4 q- S2 `# `7 g( K
安装% x/ u2 s! y7 h
yum install keepalived nginx # 我们通过nginx服务来验证虚机服务的切换1 _, k+ i+ _8 Z' r3 r
配置
& ?7 f% O- e7 f' ]5 ]& E主节点:
! z1 O c+ J- R0 T# x" ? ocat /etc/keepalived/keepalived.conf
2 G) v& s: P' B( B3 ]% y! Configuration File for keepalived9 f% K) X- q# ~+ x) k
global_defs {, q9 _& m7 U. D( R2 C2 s" H# P
router_id LVS_DEVEL2 T9 z* l1 G$ V: G0 k* [0 @% K
}4 f) M" Q6 N0 E1 {. ]" P5 o+ _
vrrp_script check_nginx_alive {, H: r8 V" [- S# e( e2 L
script "/etc/nginx/check_nginx_alive.sh" ## 检测 nginx 状态的脚本路径. D. J+ l/ J3 J, G
interval 3 ## 检测时间间隔
$ S4 g2 e9 s- l7 S. M2 W8 k weight -10 ## 如果条件成立,权重-102 h5 ?3 a/ W9 p, h3 U8 y
}
& Y+ r8 y% l5 `7 R+ W) t+ Evrrp_instance VI_1 {0 ^$ P. V" ^# E3 @6 s' C- T4 R, I
state MASTER # 主节点,备节点为BACKUP
# q1 {4 t( U2 @7 J+ K interface eth0 # 绑定的网口
9 }1 i$ O6 ^* C; A1 H3 R virtual_router_id 51 # 准备节点一致) Q3 E9 e( j0 S+ ^* |! ]
priority 100 # 权重,备节点要比主节点低( R- H3 y1 \$ y
advert_int 13 ~2 } X2 n4 l( N$ p/ ?' m. [- X
authentication { # 认证信息,准备需要一致
3 ]: p9 m. N) x" k2 C auth_type PASS+ e3 t$ F* \, N& o8 {6 Y
auth_pass 1111
& e; `. X7 Z5 d: I0 Q: K }
5 W, R7 N! z# }# x virtual_ipaddress {
8 }9 y1 ]7 q) J: O+ t 192.168.0.230 # vip,可以多个,每行一个
1 c1 V% E6 S7 n! {5 h6 H }6 |' f8 y" R3 F, a! J& s
track_script {
3 G/ ?! |0 a* _5 w9 W check_nginx_alive # 服务检测脚本1 n2 _5 Q" r. |: V
}' p2 \; G+ }* t: c! y# E7 j
}
7 n2 r, Z8 `% `/ V# Cvirtual_server 192.168.0.186 80 { # 配置虚ip以及访问的端口
& W/ I6 u% s. N B7 j% r delay_loop 6
5 b6 h5 q3 d1 @ lb_algo rr
( Y8 C; f" G3 r; K. q( w lb_kind NAT
, D P" ?% _4 ^& R3 | persistence_timeout 504 [1 y9 e# S P+ Z& w2 X1 }5 i% f
protocol TCP
' \& o% I4 Q m: M% R+ g0 t3 ~ real_server 192.168.0.187 80 { # 虚机真实ip及访问的端口
" u6 V" h0 \1 c8 a! w' z0 Y. G- @ weight 1
% \+ J. G+ P$ p TCP_CHECK {
. N( z; x H- O* o* ] connect_timeout 3$ n" K1 }3 y- @) u$ q
nb_get_retry 34 r* p) m4 C. t3 b) f' s# }+ ]
delay_before_retry 3! }* U m, @8 y
connect_port 80
8 u0 F$ x) h: f* a/ H }
0 `# l& I+ H- A* D+ T, s }1 {& {( Y4 Z* I4 |
}
" A+ V9 p+ V5 D) Pecho -e " 192.168.0.186 nginx-master" > /usr/share/nginx/html/index.html
- K5 u1 a. t6 z v( x备节点/ f0 K) m, s% M# f: A) t& `
! Configuration File for keepalived, w' }0 r6 {% a' F% a5 L
global_defs {
* c% r( Z) X) F+ s1 g5 u; S router_id LVS_DEVEL4 Z; A8 {- a+ j2 i( R2 r/ Q& ~
}4 H _) A! J1 @4 p- ]
vrrp_script check_nginx_alive {6 m, K0 L4 G# |/ D4 s6 i
script "/etc/nginx/check_nginx_alive.sh" ## 检测 nginx 状态的脚本路径
1 q0 ~+ L- [- N3 \2 Y8 I( ~- \ interval 3 ## 检测时间间隔
' J3 p: h @ j0 C. ?# y) N" r: { weight -10 ## 如果条件成立,权重-10
. `, G- S H' s) P4 @8 Q5 \/ w}
0 X+ e5 q A9 qvrrp_instance VI_1 {( w! J& }- B6 `' l; R1 c y0 t0 e
state BACKUP9 M5 F! _( I4 }4 F% ]. H
interface eth07 t5 G3 E3 `$ O' m& u' L) Z
virtual_router_id 51
# W* \3 }) } P7 r! L priority 98( |; n- H0 X/ D1 a( r4 c
advert_int 1: T; _1 K! q. m
authentication { ]* O; t: l6 T4 d$ |% h3 b/ ^$ r( [
auth_type PASS
; B/ J- m: l2 r1 R3 e, m. k auth_pass vip_test
! X# J9 [1 D& j# Y K8 c }
) m& x# {( m% i* a virtual_ipaddress {. k H( @8 U/ _) o3 E) {' O
192.168.0.2302 e5 r' Q M' M# {
}% Z* ?5 U8 ]' m% \
track_script { {3 h* o( v. J# K3 ]6 y! Y
check_nginx_alive
' k4 t a) n' x" { }
& a- q* w6 K- F1 M0 f% h+ l$ O}
" W) U( D" X! z1 ~& ?+ d' i3 ivirtual_server 192.168.0.186 80 {
+ |( p1 F3 P8 P6 L6 b( h delay_loop 6
0 X+ G+ n/ T: s* |3 j! _6 w lb_algo rr
; E) Y& U" [" Q/ z$ w1 i lb_kind NAT
6 R, a6 M4 Q/ W, A9 p: W persistence_timeout 502 _' H$ c& u4 M& T3 K
protocol TCP
+ D8 P) n2 c# q% ?; i3 K* `* J2 @' J real_server 192.168.0.187 80 {
: e, y0 m! G2 _/ ~0 N8 p weight 1
" a; b8 i B: n7 [3 V9 b# F3 H TCP_CHECK {$ q" e( F! c0 N8 k
connect_timeout 3
# q/ s0 s: Q4 ?9 e nb_get_retry 3
: H# O& Z' r. A delay_before_retry 3
; i, q5 v) i# c. E connect_port 80
. x$ \. C% _% `4 F0 w' H& D, J }7 |* D- Z Q2 k4 T6 x
}
' k# N2 I. [1 S}
0 _ i4 |% U7 `echo -e "192.168.0.187 nginx-backup" > /usr/share/nginx/html/index.html
$ p/ B. f$ S( a; F+ f' f. l( u G8 O, l主备节点添加服务检测脚本1 o7 @6 M {# |3 k( j: z4 W
cat /etc/nginx/check_nginx_alive.sh
0 c& Z7 V ~9 j& u0 j#!/bin/bash
5 ]+ \' N; Q' G' g. z) JA=`ps -C nginx --no-header |wc -l`
* J, h! Y/ H y$ p: ~1 Lif [ $A -eq 0 ]3 s' U& s( g. X( P4 @$ _- C, M
then echo 'nginx server is died'
2 G7 t) y$ e% v r( p1 t; E1 r systemctl stop keepalived4 F6 H- ?% h" L( o: m+ t5 @1 b
fi
/ t% _3 u0 X! x, C5 v3 A3 S, schmod +x /etc/nginx/check_nginx_alive.sh
2 l8 T/ _1 ~" d8 X2 W- y T主备节点启动服务
9 W+ a- H* N" j! Q% c6 nsystemctl start nginx
6 V; l. E9 z; N5 o% msystemctl start keepalived
2 e9 B+ f( O8 H T# N我们通过浏览器访问:192.168.0.230,显示的是:192.168.0.186 nginx-master, 主节点
! |0 L+ n+ j- D, i7 T4 x# o把主节点的keepalived服务关闭:systemctl stop keepalived, 浏览器再访问192.168.0.230,显示的是:192.168.0.187 nginx-backup,切换到备节点# ~. Q4 W3 B4 g' r
再把主节点的keepalived服务启动:systemctl start keepalived,浏览器再次访问:192.168.0.230,显示的是: 192.168.0.186 nginx-master,已经切回到主节点
9 G4 J4 Y/ t/ j N |
|