openstack-虚机-keepalived-vip-配置及问题解决

多台虚机需要使用组成高可用模式,需要在openstack里配置一个虚ip对外提供服务。由于keepalived使用的是VRRP协议,所以还需要在配置高可用的虚机安全组放开VRRP协议的规则

环境

主节点: 172.23.6.200
备节点: 172.23.6.201
VIP: 172.23.6.2

创建虚IP

直接在控制台导航:管理员-系统-网络,点击虚机所在的网络名称,进入详情页面,然后点击创建端口按钮,在弹出的窗口,填入名称(eg: my_vip)。在该详情页可以看到该端口对应的固定ip,后面会用到该IP

虚拟机启用VIP

在控制节点执行:

1
2
3
4
5
# 1
neutron port-list|grep VM_IP # 根据虚拟机IP获取port_id
# 2
neutron port-update PORT_ID --allowed_address_pairs list=true type=dict ip_address=VIP # PORT_ID为上一步获取到的port_id,VIP为前面创建的虚ip

有几台虚机,就重复几次执行 1、2 步骤

安全组允许VRRP协议

直接在控制台导航:项目-访问&安全,搜索虚机所在的安全组, 然后点击后面的管理规则按钮进入规则列表;点击添加规则按钮,弹出框里,在规则的下拉选里选择 其他协议, 然后再 端口 文本框输入 112, 最后点击添加按钮即可 # VRRP协议的端口号是112

配置keepalived

安装

1
yum install keepalived nginx # 我们通过nginx服务来验证虚机服务的切换

配置

主节点:

cat /etc/keepalived/keepalived.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_script check_nginx_alive {
script "/etc/nginx/check_nginx_alive.sh" ## 检测 nginx 状态的脚本路径
interval 3 ## 检测时间间隔
weight -10 ## 如果条件成立,权重-10
}
vrrp_instance VI_1 {
state MASTER # 主节点,备节点为BACKUP
interface eth0 # 绑定的网口
virtual_router_id 88 # 准备节点一致
priority 100 # 权重,备节点要比主节点低
advert_int 1
authentication { # 认证信息,准备需要一致
auth_type PASS
auth_pass vip_test
}
virtual_ipaddress {
172.23.6.2 # vip,可以多个,每行一个
}
track_script {
check_nginx_alive # 服务检测脚本
}
}
virtual_server 172.23.6.2 80 { # 配置虚ip以及访问的端口
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 172.23.6.200 80 { # 虚机真实ip及访问的端口
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}

1
echo -e "172.23.6.200 nginx-master" > /usr/share/nginx/html/index.html

备节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_script check_nginx_alive {
script "/etc/nginx/check_nginx_alive.sh" ## 检测 nginx 状态的脚本路径
interval 3 ## 检测时间间隔
weight -10 ## 如果条件成立,权重-10
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 88
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass vip_test
}
virtual_ipaddress {
172.23.6.2
}
track_script {
check_nginx_alive
}
}
virtual_server 172.23.6.2 80 {
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 172.23.6.201 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
1
echo -e "172.23.6.201 nginx-backup" > /usr/share/nginx/html/index.html

主备节点添加服务检测脚本

cat /etc/nginx/check_nginx_alive.sh

1
2
3
4
5
6
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ]
then echo 'nginx server is died'
systemctl stop keepalived
fi

chmod +x /etc/nginx/check_nginx_alive.sh

主备节点启动服务

1
2
systemctl start nginx
systemctl start keepalived
  • 我们通过浏览器访问:172.23.6.2,显示的是:172.23.6.200 nginx-master, 主节点
  • 把主节点的keepalived服务关闭:systemctl stop keepalived, 浏览器再访问172.23.6.2,显示的是:172.23.6.201 nginx-backup,切换到备节点
  • 再把主节点的keepalived服务启动:systemctl start keepalived,浏览器再次访问:172.23.6.2,显示的是:172.23.6.200 nginx-master,已经切回到主节点