描述

当你在openstack平台创建一个network,在这个network上创建两台虚拟机,当这两台虚拟机还需要VIP时,你从这个network分配一个地址做为VIP,配置到虚拟机上,你会发现这个VIP并不能被访问。因为在neutron中,从 VM 端口发送/接收的数据包必须具有该 VM 端口的固定 IP/MAC 地址,所以虚拟机的端口在创建时就会把IP/MAC进行了绑定。有这条规则存在,所以VIP 是无法与外部通信,但可以通过如下两个方法来解决。

  • 方法1(推荐): 为需要使用VIP的虚拟机端口配置allwed_address_pairs
  • 方法2: 为需要使用VIP的虚拟机端口disable_secruity

openstack version: Train

方法1

allwed_address_pairs: 允许一个端口在该端口上添加额外的 IP/MAC 地址对,以允许与这些指定值匹配的流量, 使额外的IP能与外部通信。

安全组放通VRRP协议(可选)

keeplived场景下,虚拟机所在安全组放通VRRP协议,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议,可以认为是实现高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。

# 找到虚拟机所在安全组的id(3a02e44f-d5bb-40de-99b5-f9467e456bc7)
$ openstack security group rule create 3a02e44f-d5bb-40de-99b5-f9467e456bc7 --protocol vrrp --ingress --remote-ip 0.0.0.0/0
$ openstack security group rule create 3a02e44f-d5bb-40de-99b5-f9467e456bc7 --protocol vrrp --egress --remote-ip 0.0.0.0/0
配置allwed_address_pairs
# 虚拟机端口和VIP都是使用这个network分配的IP
$ openstack network list
  test_network  a75d1c08-73d7-476e-be3a-37d4532672eb


# 从test_network创建一个VIP地址为:192.168.2.253 , 名字为:test-vip
$ neutron port-create test_network --allowed-address-pairs type=dict list=true ip_address=192.168.2.253 --name test-vip
+-----------------------+--------------------------------------------------------------------------------------+
| Field                 | Value                                                                                |
+-----------------------+--------------------------------------------------------------------------------------+
| admin_state_up        | True                                                                                 |
| allowed_address_pairs | {"ip_address": "192.168.2.253", "mac_address": "fa:16:3e:ab:0f:ad"}                  |
| binding:host_id       |                                                                                      |
| binding:profile       | {}                                                                                   |
| binding:vif_details   | {}                                                                                   |
| binding:vif_type      | unbound                                                                              |
| binding:vnic_type     | normal                                                                               |
| created_at            | 2022-02-26T13:57:15Z                                                                 |
| description           |                                                                                      |
| device_id             |                                                                                      |
| device_owner          |                                                                                      |
| extra_dhcp_opts       |                                                                                      |
| fixed_ips             | {"subnet_id": "4a7237fc-10a8-4a44-b711-57dfbcee569a", "ip_address": "192.168.2.237"} |
| id                    | 490ba237-649d-4a52-a923-fbad0c00702a                                                 |
| mac_address           | fa:16:3e:ab:0f:ad                                                                    |
| name                  | test-vip                                                                             |
| network_id            | a75d1c08-73d7-476e-be3a-37d4532672eb                                                 |
| port_security_enabled | True                                                                                 |
| project_id            | a3f435fc08854b828b3346aa1581d39f                                                     |
| revision_number       | 1                                                                                    |
| security_groups       | 3a02e44f-d5bb-40de-99b5-f9467e456bc7                                                 |
| status                | DOWN                                                                                 |
| tags                  |                                                                                      |
| tenant_id             | a3f435fc08854b828b3346aa1581d39f                                                     |
| updated_at            | 2022-02-26T13:57:15Z                                                                 |
+-----------------------+--------------------------------------------------------------------------------------+

# 为需要使用VIP的虚拟机端口添加`allwed_address_pairs`属性。
# vm1 port_id=1bd248cb-a543-46a4-b4ae-8ec9f93ce713
# vm2 port_id=c454a763-2bed-4164-a725-e2ded705c942
$ neutron port-update 1bd248cb-a543-46a4-b4ae-8ec9f93ce713 --allowed-address-pairs type=dict list=true ip_address=192.168.2.253
$ neutron port-update c454a763-2bed-4164-a725-e2ded705c942--allowed-address-pairs type=dict list=true ip_address=192.168.2.253

# 查看端口下是否具有allowed_address_pairs属性。
$ openstack port show 1bd248cb-a543-46a4-b4ae-8ec9f93ce713 | grep allowed_address_pairs
  | allowed_address_pairs   | ip_address='192.168.2.253', mac_address='fa:16:3e:d1:0d:1d'
$ openstack port show c454a763-2bed-4164-a725-e2ded705c942 | grep allowed_address_pairs
  | allowed_address_pairs   | ip_address='192.168.2.253', mac_address='fa:16:3e:d1:0d:1d'

# 从vm端口删除allwed_address_pairss属性,也就是删除VIP。
$ openstack port unset 1bd248cb-a543-46a4-b4ae-8ec9f93ce713 --allowed-address ip-address='192.168.2.253',mac-address='fa:16:3e:d1:0d:1d'
方法2
删除port安全组

安全组: 连接到虚拟机实例的端口的所有传入和传出流量都被阻止(除非已应用“安全组相应规则”)

# 从test_network创建一个VIP地址为:192.168.2.253 , 名字为:test-vip
$ neutron port-create test_network --allowed-address-pairs type=dict list=true ip_address=192.168.2.253 --name test-vip

# 把VIP的端口安全组关闭掉(找到VIP端口的port id)
$ openstack port set --disable-port-security --no-security-group 490ba237-649d-4a52-a923-fbad0c00702a 
# 把需要使用VIP的虚拟机端口安全组关闭掉(找到VM端口的port id)
$ openstack port set --disable-port-security --no-security-group  1bd248cb-a543-46a4-b4ae-8ec9f93ce713
$ openstack port set --disable-port-security --no-security-group   c454a763-2bed-4164-a725-e2ded705c942