在云平台中,存在两台虚机提供http服务,现在需要使用keepalived形成集群,并通过一个浮动IP访问keepalived的VIP来访问两台虚机
理论分析:
该需求实现需要拆分为以下几步:
1、两个nginx虚机要形成keepalived集群,集群只对外暴露一个VIP
2、两个虚机的内网要连接到一个L3 router
3、VIP需要分配一个浮动IP,并将VIP和浮动IP绑定起来
4、安全组除了原来的TCP/ICMP/UDP之外,还需要放通vrrp协议,便于交互vrrp报文
5、两台虚机配置keepalived和httpd,对外提供服务
在线上环境中,两个虚机的内网已经连接到了一个L3 router,因此2条件已满足,只需要配置1,3,4即可。
整体架构图:
环境介绍:
基于openstack Pike版的二次开发的私有云,neutron的网络模式用的二层vlan模式
外网网络是10.200.46.0/24,内网网络是192.168.0.0/24。
keepalive的VIP是192.168.0.10,两台虚机的IP分别是192.168.0.6和192.168.0.9
配置步骤(包含命令行和页面配置两种):
1、两个nginx虚机要形成keepalived集群,集群只对外暴露一个VIP
openstack中,当开启了端口安全的功能,neutron默认会把所有端口的IP和MAC进行一对一的绑定,并把对应的关系存放在mariadb数据库中。默认其他IP的报文到了这台虚机直接做丢弃处理。
#查看subnet_id和network名字
$ neutron subnet-list
$ neutron net-list
#创建一个VIP的port
$ neutron port-create --fixed-ip subnet_id=92ddfff3-e272-47f8-935b-618cf7c5e9d3,ip_address=192.168.0.10 --name vip-port internal
页面修改方法
页面位于:网络--internal--端口--创建端口
修改两台虚机的端口属性,允许VIP的IP通过
命令行修改方法
#获取两台虚机的端口的UUID
$ neutron port-list
#更新端口属性
$ neutron port-update <port-uuid> --allowed-address-pair ip_address=192.168.0.10
页面修改方法
页面位于:网络--选定网络internal--端口--选定端口(必须是虚机的端口)
添加可用地址对
填入需要允许通过的VIP
针对vm01和vm02的端口分别操作即可
2、给VIP分配一个浮动IP,并将VIP和浮动IP绑定起来
注:页面没办法指定分配的浮动IP的IP地址,若要指定分配某个浮动IP,只能在后台通过命令行来指定
命令行修改方法
#获取external网络uuid
$ neutron net-list
#创建一个浮动IP给该项目,记录浮动IP的uuid
$ neutron floatingip-create --floating-ip-address 10.200.46.105 af396b4b-ea3d-41b5-8528-a973316e9f48
#获取VIP的port ID
$ neutron port-list |grep 192.168.0.10
#把浮动IP和VIP的端口绑定起来
$ neutron floatingip-associate <floatingip UUID> <port UUID>
$ neutron floatingip-associate 54d4436e-503f-4e85-85a9-e1eb99dec75f d95cc018-3ca1-477d-8d90-3d9b262c5ee0
页面修改方法
页面位置:网络--浮动IP--分配IP给项目
资源池选择10.200.46.0/24的网段
把分配好的浮动IP和VIP的端口绑定
绑定成功
3、安全组中放通vrrp协议报文
建议horizon页面配置,命令行配置较复杂,不在此demo了
页面位于:网络--安全组--选定安全组--管理规则
添加两条规则,入口和出口都要放通
添加完成后把安全组应用到vm01和vm02即可
4、两台虚机中配置keepalived和httpd
#两台上虚机安装httpd和keepalived的yum包
$ yum install keepalived -y && yum install httpd -y
#两台虚机上分别配置开机自启httpd,并启动服务
$ systemctl enable httpd && systemctl start httpd
#两台虚机上分别写入虚机的hostname作为http返回的页面
$ echo $(hostname) > /usr/share/httpd/noindex/index.html
#配置keepalived
在vm01上配置
$ vim /etc/keepalived/keepalived.conf
global_defs {
.....
#vrrp_strict #严格执行vrrp协议规范,如果不注释掉就算VIP分配成功也无法ping通
.....
}
vrrp_instance VI_1 {
state MASTER #keepalived的角色,MASTER或BACKUP
interface eth0 #keepalived协议报文交互使用的端口
virtual_router_id 51 #keepalived协议报文的字段,每组keepalived必须不同,其实就是vrrp的vrrp id
priority 100 #选举优先级,越高越优先
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipadress {
192.168.0.10 #VIP的IP地址
}
}
在vm02上配置
$ vim /etc/keepalived/keepalived.conf
global_defs {
.....
#vrrp_strict #严格执行vrrp协议规范,如果不注释掉就算VIP分配成功也无法ping通
.....
}
vrrp_instance VI_1 {
state BACKUP #keepalived的角色,MASTER或BACKUP
interface eth0 #keepalived协议报文交互使用的端口
virtual_router_id 51 #keepalived协议报文的字段,每组keepalived必须不同,其实就是vrrp的vrrp id
priority 50 #选举优先级,越高越优先
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipadress {
192.168.0.10 #VIP的IP地址
}
}
至此,配置完毕,进行验证测试
外网ping 10.200.46.105
访问10.200.46.105对外提供的http服务
长ping 10.200.46.105,重启vm01,再次访问http服务,观察对外提供服务的是否切换为vm02
至此,验证完毕,当vm01发生故障时,keepalived可以正常生效,切换到vm02