幾句話說清楚openstack的網絡問題
阿新 • • 發佈:2018-06-26
互聯網絡 成了 vsc 限制 table 聯系 就會 需要 手動
openstack網絡概念術語比較多,從網絡所處的位置來講可以分為兩類:
一個是openstack各個物理節點(host)的物理網卡之間的互聯網絡。
一個是openstack 裏面的虛擬網絡世界(neutron),互聯用戶(tenant)的
虛機,這時候用到的術語一般是provider network(external network,public
network), tenant network(private network,internal network)意思都差不多
。兩者都是neutron create的網絡,但是provider network創建的時候需要
指定provider physical network(關聯到host上的物理網絡),從而這部分網
絡是直接可以和外界聯系的。Private network則是虛機instance直接連接的
網絡,這個網絡保證虛機之間的通信,如果要和外部通信,通常經過一
個router連接到provider network segment上。
Provider physical network是事先在neutron plugin的配置文件裏指定的:
/etc/neutron/plugins/ml2/openvswitch_agent.ini:
bridge_mappings=extnet:br-ex.
比如這裏就指定一個可以在neutron create network時候使用的
provider phy network名叫extnet,它被mapping到host上的一個
br-ex open virtual switch.
這個br-ex需要自己手動創建, openstack不會幫助創建。創建的辦法可以
是使用ovs-vsctl命令創建,這種是not persistent的,也可以直接寫
ifcfg-br-ex文件來創建persistent的。這個br-ex需要手動添加host的物理網口
,才能真正和外界的物理網絡聯系起來。方法也是用命令add port或者創建
ifcfg-eth*文件來實現。
一個instance通常掛在private network上,當然也可以增加一個網口直接
掛在provider network上,分配provider network的ip地址。
不管provider 還是internal network, 創建的時候都默認開啟dhcp 功能,
創建instance的時候就可以自動獲取該網段的ip.
Instance創建的時候,在compute host上會對應每一個instance的網口創
建一個tap interface, 那麽這個tap interface之間以及和外部provider
network 之間是如何聯系起來的?很關鍵的一個是openstack創建的br-int
這個integration bridge. 每個tap interface會被加到這個integration bridge,
所以tap interface之間的通信也就自然實現了。 而provider對應的br-ex又
會被patch port連接到這個br-int,所以虛機和外界通信的通道也建立起
來了(這個通道是為那些create了直接attach到provider network的port的
虛機準備的)。
因為 br-ex是直接連到物理網絡的,所以對應不同節點上的instance如果要
使用到這個br-ex對應的provider網絡,都需要手動建立br-ex ovs,並綁定物
理端口。
那不同節點上的instance之間如果都attach到同一個neutron create的internal
network上,彼此之間又是如何通信的呢?顯然需要各個節點上的br-int能
夠互聯。這個互聯是通過vxlan對應的gre tunnel實現的。這個只需要
在neutron裏面配置tunnel的end ip就行了:
/etc/neutron/plugins/ml2/openvswitch_agent.ini:
local_ip=10.10.10.4 (10.10.10.4是本節點的eth*的ip).
在創建了虛機之後就會發現ovs-vsctl show出來有一個bridge br-tun並且生
成了tunnel。這個br-tun把不同的compute host聯系起來,而他自身又
被patch到br-int,自然就把不同host上的虛機給打通了。
另外provider network經常提到vlan 的概念,其實就是br-ex綁定的物理網
口上支持vlan, 從而也可以一個網口創建多個外部網絡。 neutron配置文件
加上:
/etc/neutron/plugins/ml2/ml2_conf.ini:network_vlan_ranges=extent
就可以。在neutron中創建provider網絡的時候接可以指定vlan id了。上面
的extnet後面也可以跟一個vlan range,但是 不跟表示所有的。
在使用vlan的provider的時候,涉及到ovs 的openflow, 它的作用就是在
從internal network 的instance tap interface到外部網絡的時候,給對應的
流打上正確的vlan標簽。因為內部網絡的vlan是自動劃分的,和外部vlan
不能劃等號但是有對應關系(就是create instance的時候哪個網口連到哪
個外部網絡決定的對應關系),所以ovs上的openflow的規則就實現這個
內部vlan到外部vlan的轉換。
在創建虛機的時候會指定security group,它最終體現為host上的一系
列iptables的rules. Iptables -L可以看到。如果你只是實驗網絡不關心安全
又擔心這些規則有問題限制了一些通信,可以簡單的iptables -F臨時清空。
幾句話說清楚openstack的網絡問題