到目前,OpenStack上的VM,必需透過Router連接External Network,由OVN進行SNAT或DNAT,才能夠實現上網的行為。又因為Floating IP是採用DNAT的原理實現,在VM裡面,我們看不到實際使用的Public IP。有時候我們會希望VM的網路卡設定,看起來如同實際主機一樣可以看到Public IP的設定。如果有這種需求,建立VM時,可以讓VM直接使用 External Network,而不是使用一般的Internal Network,讓VM可以直接透過External Network上網,而不用經過Router做NAT轉換。
要讓VM直接用實體網路上網,前提必需在每個computer node上要有br-ex。要完成這個設定,可以透過packstack參數
--os-neutron-ovn-bridges-compute=br-eth2,br-ex
來達到。完整的packstack指令為:packstack \ --nova-libvirt-virt-type=kvm \ --keystone-admin-passwd=password \ --os-debug-mode=y \ --provision-demo=n \ --os-cinder-install=n \ --os-swift-install=n \ --os-aodh-install=n \ --os-ceilometer-install=n \ --os-horizon-install=n \ --os-neutron-ml2-type-drivers=flat,vlan \ --os-neutron-ml2-vlan-ranges=flat0:3001:4000 \ --os-neutron-ml2-flat-networks=* \ --os-neutron-ml2-tenant-network-types=' ' \ --os-neutron-ml2-mechanism-drivers=ovn \ --os-neutron-l2-agent=ovn \ --os-neutron-ovn-bridge-mappings=extnet0:br-ex,flat0:br-eth2 \ --os-neutron-ovn-bridge-interfaces=br-ex:eth0,br-eth2:eth2 \ --os-neutron-ovn-bridges-compute=br-eth2,br-ex \ --os-neutron-ovn-tunnel-if=eth1 \ --os-controller-host=192.168.33.10 \ --os-network-hosts=192.168.33.10 \ --os-compute-hosts=192.168.33.20,192.168.33.30 \ --install-hosts=192.168.33.10,192.168.33.20,192.168.33.30
至於為什麼要讓br-ex在每個compute node上都存在才可以直接用實體網路上網,我們等會兒看到節點上bridge的長像再說明。
我們先來比較一下今天的架構和之前的架構相差的地方:
openstack network create --provider-network-type flat --provider-physical-network extnet0 ext_n1 \
--external
# for VirtualBox
SUBNET_RANGE=10.0.2.0/24
GATEWAY=10.0.2.2
ALLOCATION_RANGE=start=10.0.2.210,end=10.0.2.220
openstack subnet create --subnet-range ${SUBNET_RANGE} --network ext_n1 ext_n1subnet \
--gateway ${GATEWAY} \
--allocation-pool ${ALLOCATION_RANGE}
IMAGE_ID=$(openstack image show cirros --format json | jq -r .id)
openstack server create --nic net-id=ext_n1 --flavor m1.nano --image $IMAGE_ID vm_1
# Network
openstack network list --long -c ID -c "Network Type" -c "Router Type" | abbrev
+--------+--------------+-------------+
| ID | Network Type | Router Type |
+--------+--------------+-------------+
| 765501 | flat | External |
+--------+--------------+-------------+
openstack port list --long -c ID -c "Fixed IP Addresses" -c "Device Owner" | abbrev
+--------+---------------------------------------------+---------------------+
| ID | Fixed IP Addresses | Device Owner |
+--------+---------------------------------------------+---------------------+
| 6a57bd | ip_address='10.0.2.216', subnet_id='f184ca' | compute:nova |
| 06dfae | ip_address='10.0.2.210', subnet_id='f184ca' | network:distributed |
+--------+---------------------------------------------+---------------------+
查看North Bound DB的情況,與Day-17: Flat Tenant Network相比,完全都相同,只是provider network改為使用extnet0
而不是flat0
.
我們複習Day-21: Router 連接External Network的bridge架構,在compute-01上的VM,透過geneve tunnel將對外的封包送到network-conoroller 後,由network-conoroller的eth0到Internet。換句話說,如果是透過Router連接External Network,封包會統一由network-conoroller進出,所以只需要在network-conoroller有br-ex bridge。
但是,如果是讓VM直接使用External Network,則必需在每個Compute node上都建立br-ex,這個概念和建立Flat Network時,會使用到每個compute node上的br-eth2 bridge相同,才能讓不同compute node上的VM互通。只是現在是改用br-ex bridge,且br-ex bridge所使用的eth0介面的網路上有一個對外的gateway。因此,VM要上網的封包,直接透過compute node上的eth0,由實體網路的gateway出去,而不用經過network-controller。
照一般常見的架構,在實驗環境裡的三個節點的eth0,應該都要在同一個網段,一旦建立使用eth0的Flat External Network後,在這個Flat External Network的VM都可以上網,彼此間也可以直接通訊。但是,因為VirtualBox建立的每個VM的eth0是獨立的NAT網路,所以在我們今天的實驗環境裡,多個VM是無法透過今天建立的Flat External Network互通。
我們在compute-1上分別對br-ex用的eth0與geneve tunnel用的eth1抓封包,可以看到VM對外的封包,直接經由compute-01的eth0經由VirtualBox的gateway出去;且在geneve tunnel上,則看不到任何的封包。
tcpdump -i eth0 -n icmp
04:33:10.500177 IP 10.0.2.15 > 8.8.8.8: ICMP echo request, id 3, seq 1, length 64
04:33:10.508025 IP 8.8.8.8 > 10.0.2.15: ICMP echo reply, id 3, seq 1, length 64
tcpdump -vvneei eth1 'udp port 6081' # 在geneve tunnel 無封包