openstack云中的虚机使用keepalived共享一个浮动IP对外提供服务

时间:2024-04-13 16:55:04

在云平台中,存在两台虚机提供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云中的虚机使用keepalived共享一个浮动IP对外提供服务

 

环境介绍:

基于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的报文到了这台虚机直接做丢弃处理。
openstack云中的虚机使用keepalived共享一个浮动IP对外提供服务
 
#查看subnet_id和network名字
$ neutron subnet-list
$ neutron net-list
openstack云中的虚机使用keepalived共享一个浮动IP对外提供服务
openstack云中的虚机使用keepalived共享一个浮动IP对外提供服务
 
#创建一个VIP的port
$ neutron port-create --fixed-ip subnet_id=92ddfff3-e272-47f8-935b-618cf7c5e9d3,ip_address=192.168.0.10 --name vip-port internal
openstack云中的虚机使用keepalived共享一个浮动IP对外提供服务
 
 
页面修改方法
页面位于:网络--internal--端口--创建端口
openstack云中的虚机使用keepalived共享一个浮动IP对外提供服务
 
 
 
修改两台虚机的端口属性,允许VIP的IP通过
命令行修改方法
#获取两台虚机的端口的UUID
$ neutron port-list 
openstack云中的虚机使用keepalived共享一个浮动IP对外提供服务
 
#更新端口属性
$ neutron port-update <port-uuid> --allowed-address-pair ip_address=192.168.0.10
openstack云中的虚机使用keepalived共享一个浮动IP对外提供服务
 
页面修改方法
页面位于:网络--选定网络internal--端口--选定端口(必须是虚机的端口)
openstack云中的虚机使用keepalived共享一个浮动IP对外提供服务
 
添加可用地址对
openstack云中的虚机使用keepalived共享一个浮动IP对外提供服务
 
填入需要允许通过的VIP
 
 
openstack云中的虚机使用keepalived共享一个浮动IP对外提供服务
针对vm01和vm02的端口分别操作即可
 
 
 
2、给VIP分配一个浮动IP,并将VIP和浮动IP绑定起来
注:页面没办法指定分配的浮动IP的IP地址,若要指定分配某个浮动IP,只能在后台通过命令行来指定
命令行修改方法
#获取external网络uuid
$ neutron net-list
openstack云中的虚机使用keepalived共享一个浮动IP对外提供服务
#创建一个浮动IP给该项目,记录浮动IP的uuid
$ neutron floatingip-create --floating-ip-address 10.200.46.105 af396b4b-ea3d-41b5-8528-a973316e9f48
openstack云中的虚机使用keepalived共享一个浮动IP对外提供服务
 
#获取VIP的port ID
$ neutron port-list |grep 192.168.0.10
openstack云中的虚机使用keepalived共享一个浮动IP对外提供服务
 
#把浮动IP和VIP的端口绑定起来
$ neutron floatingip-associate <floatingip UUID> <port UUID>
$ neutron floatingip-associate 54d4436e-503f-4e85-85a9-e1eb99dec75f d95cc018-3ca1-477d-8d90-3d9b262c5ee0
openstack云中的虚机使用keepalived共享一个浮动IP对外提供服务
 
页面修改方法
页面位置:网络--浮动IP--分配IP给项目
openstack云中的虚机使用keepalived共享一个浮动IP对外提供服务
 
资源池选择10.200.46.0/24的网段
openstack云中的虚机使用keepalived共享一个浮动IP对外提供服务
 
把分配好的浮动IP和VIP的端口绑定
openstack云中的虚机使用keepalived共享一个浮动IP对外提供服务
 
openstack云中的虚机使用keepalived共享一个浮动IP对外提供服务
绑定成功
openstack云中的虚机使用keepalived共享一个浮动IP对外提供服务
 
3、安全组中放通vrrp协议报文
建议horizon页面配置,命令行配置较复杂,不在此demo了
页面位于:网络--安全组--选定安全组--管理规则
添加两条规则,入口和出口都要放通
openstack云中的虚机使用keepalived共享一个浮动IP对外提供服务
 
openstack云中的虚机使用keepalived共享一个浮动IP对外提供服务
 
添加完成后把安全组应用到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
openstack云中的虚机使用keepalived共享一个浮动IP对外提供服务
 
访问10.200.46.105对外提供的http服务
openstack云中的虚机使用keepalived共享一个浮动IP对外提供服务
 
长ping 10.200.46.105,重启vm01,再次访问http服务,观察对外提供服务的是否切换为vm02
openstack云中的虚机使用keepalived共享一个浮动IP对外提供服务
 
openstack云中的虚机使用keepalived共享一个浮动IP对外提供服务
 
至此,验证完毕,当vm01发生故障时,keepalived可以正常生效,切换到vm02