在实际业务运行中,为提高业务可用性,经常会采用HA集群保证业务的可用性,如Web架构经常使用的Keepalived+lvs,就属于实现业务HA的一种方式,采用HA集群必然会产生多个IP。但由于OpenStack安全组规则,在实际使用中还需要稍做配置才能正常运行,本文只讲解对应解决方法,希望各位在使用OpenStack中有所参考。

前言

在OpenStack 中,有提供安全组功能实现对VM的访问管理。

安全组功能是通过linux iptables 来实现的,当虚机建立时,在对应的计算节点上会建立对应的chian,chian命名以i 和o 开头再加上tap设备的数字id号.

可通过iptables-save 来查看对应chian。

测试环境

基于L版建立来两台虚机(Keepalived01 IP:172.16.200.193 Keepalived02 IP:172.16.200.194 VIP : 172.16.200.251),用来演示配置方法。

如VM tap名称如下:

我们来查看对应chian及filter:

通过iptables -vnL[chian] 还可以看到更具体的filter。

关于OpenStack安全组更多资料可去https://wiki.openstack.org/wiki/Neutron/SecurityGroups 了解更多信息。

1,生产中有在使用openstack 时,使用Keepalived 来构建自己的业务,默认情况下vip 会出现多个. 类似下图:

这里需要注意的是 Keepalived 使用的是vrrp 协议,不是tcp和udp 协议,将tcp和udp 全部允许之后vrrp照样无法通讯,如果需要使用vrrp,在配置界面是没有vrrp的选项。如下图

我们在建立规则时需要选择其它协议,然后填写对应协议id 号,这样就能允许vrrp正常通信。

注:如果需要使用其它协议,可在以下页面查底对应ID 号。 https://zh.wikipedia.org/wiki/IP%E5%8D%8F%E8%AE%AE%E5%8F%B7%E5%88%97%E8%A1%A8

配置完成后可以查看下对应计算节点上产生的规则.

我们将入口及出口都加上对应规则之后再来看vip 情况 。

目前状态已经正常。

虽然在VRRP能正常通信,由于VM创建时会有一条iptables 用来将ip和mac绑定,用来防止arp 欺骗。具体如下: 因为有这条规则存在,所以VIP 是无法与外部通信。 这里社区有两种方法来解决,一种是使用allowed-address-pairs来扩展端口属性,允许手动指定端口的mac_address和ip 地址对的流量通过。

具体操作如下:

建立带allowed-address-pairs 属性VIP 端口:

neutron port-create [net name] —allowed-address-pairs type-dict list-true

ip_address=[ip address] 添加 allowed-address-pairs

neutron port-update [vm port id] --allowed-address-pairs type=dict list=true ip_address=[ip address]

注:这里的[ vm port id ]是指运行Keepalived 服务主机port id。

如我运行Keepalived 服务的IP 是172.16.200.193, 对应的 port id 为2547a877-6a2e-4b99-89ab-c0253e4db3f8

更新结果如下,再在物理节点上可以看到对应的规则已经生成。

测试可以看到能够正常通信。

注:如果需要删除allowed-address-pairs 属性,只能使用API接口.具体如下:

curl -i http://opennstack_vip:9696/2.0/ports/.json -X PUT -H "X-Auth-Token: a804e19408574d54b90de06ace41fe02" -H "Content-Type: application/json" -H "Accept: application/json" -H "User-Ag
ent: python-neutronclient" -d '{"port": {"allowed_address_pairs": []}}’

对应allowed_address_pairs 属性已经移除

第二种是使用port_security_enabled属性,port_security_enabled 是在kilo版后加入的Ml2扩展驱动,可能针对整个网络更改,也可针对某个端口更改,默认为true。

具体可参考https://wiki.openstack.org/wiki/Neutron/ML2PortSecurityExtensionDriver。

这里手动使VIP 飘至keepalived02 节点。

keepalived02节点未配置allowed-address-pairs ,目前无法通信。

接下来修改port_security_enabled 来使keepalived02节点上的VIP能够通信。先去除keepalived02 VM的安全组。

neutron port-update —no-security-groups  [vm id]

更新keepalived02 VM port-security-enable 为False

neutron port-update [vm port id] —port_security_enabled=False

注:vm port id 为当前vm 所绑定port id

验证,可以看到这里已经能正常通信 。

以上两种方法,在实际生产中可根据不同场景进行选择,—allowed-address-pairs 适合少量VM 组成的集群,如果使用keepalived + lvd DR模式,后面Real Server 都需要VIP,都需要手动配置的,使用—allowed-address-pairs它的安全组还是生效的。port-security-enable 这种方式可灵活性相对较高(它可针对某个网络),也可对IP进行变更,虽然我不建议这样做。缺点是安全组不再生效,当然可以在VM OS里启用iptables。下图是使用port-security-enable之后产生的对应规则。在实际生产中怎么使用,各位可需要根据业务及网络实际情况考虑。

http://t.cn/Rfo1z73

完毕。