幾句話說清楚openstack的網絡問題

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: 
    bridgemappings=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會經過一個linux bridge連接到這個integration bridge, 所以tap interface之間的通信也就自然實現了。 而provider對應的br-ex又會被patch port連接到這個br-int,所以虛機和外界通信的通道也建立起 來了(這個通道是爲那些create了直接attach到provider network的interface的虛機準備的)。

因爲 br-ex是直接連到物理網絡的,所以對應不同節點上的instance如果要使用到這個br-ex對應的provider網絡,都需要手動建立br-ex ovs,並綁定物理端口。

那不同節點上的instance之間如果都attach到同一個neutron create的internal network上,彼此之間又是如何通信的呢?顯然需要各個節點上的br-int能夠互聯。這個互聯是通過vxlan對應的gre tunnel實現的。這個只需要在neutron裏面配置tunnel的ip就行了:

        /etc/neutron/plugins/ml2/openvswitch_agent.ini:
        localip=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=extnet 

就可以。在neutron中創建provider網絡的時候接可以指定vlan id了。上面的extnet後面也可以跟一個vlan range,如果不跟就是表示所有的vlan。

在使用vlan的provider的時候,涉及到ovs 的openflow, 它的作用就是在從internal network 的vm tap interface到外部網絡的時候,給對應的流打上正確的vlan標籤。因爲內部網絡的vlan是自動劃分的,和外部vlan不能劃等號但是有對應關係(就是create vm的時候哪個網口連到哪個外部網絡決定的對應關係),所以ovs上的openflow的規則就實現這個內部vlan到外部vlan的轉換。

在創建虛機的時候會指定security group,它最終體現爲host上的一系列iptables的rules. Iptables -L可以看到。如果你只是實驗網絡不關心安全又擔心這些規則有問題限制了一些通信,可以簡單的iptables -F臨時清空。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章