描述
當你在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