上一節咱們完成了 OVS vlan 環境的搭建,當前拓撲結構以下:網絡
cirros-vm1 位於控制節點,屬於 vlan100。
cirros-vm2 位於計算節點,屬於 vlan100。
cirros-vm3 位於計算節點,屬於 vlan101。學習
今天詳細分析 OVS 如何實現 vlan100 和 vlan101 的隔離。
與 Linux Bridge driver 不一樣,Open vSwitch driver 並不經過 eth1.100, eth1.101 等 VLAN interface 來隔離不一樣的 VLAN。全部的 instance 都鏈接到同一個網橋 br-int,Open vSwitch 經過 flow rule(流規則)來指定如何對進出 br-int 的數據進行轉發,進而實現 vlan 之間的隔離。
具體來講:當數據進出 br-int 時,flow rule 能夠修改、添加或者剝掉數據包的 VLAN tag,Neutron 負責建立這些 flow rule 並將它們配置到 br-int,br-eth1 等 Open vSwitch 上。spa
下面咱們就來研究一下當前的 flow rule。ci
查看 flow rule 的命令是 ovs-ofctl dump-flow <bridge>
首先查看計算節點 br-eth1 的 flow rule: 路由
br-eth1 上配置了四條 rule,每條 rule 有很多屬性,其中比較重要的屬性有:it
priority
rule 的優先級,值越大優先級越高。Open vSwitch 會按照優先級從高到低應用規則。io
in_port
inbound 端口編號,每一個 port 在 Open vSwitch 中會有一個內部的編號。
能夠經過命令 ovs-ofctl show <bridge> 查看 port 編號。
好比 br-eth1:
配置
eth1 編號爲 1;phy-br-eth1 編號爲 2。im
dl_vlan
數據包原始的 VLAN ID。數據
actions
對數據包進行的操做。
br-eth1 跟 VLAN 相關的 flow rule 是前面兩條,下面咱們來詳細分析。
清晰起見,咱們只保留重要的信息,以下:
priority=4,in_port=2,dl_vlan=1 actions=mod_vlan_vid:100,NORMAL priority=4,in_port=2,dl_vlan=5 actions=mod_vlan_vid:101,NORMAL
第一條的含義是:
從 br-eth1 的端口 phy-br-eth1(in_port=2)接收進來的包,若是 VLAN ID 是 1(dl_vlan=1),那麼須要將 VLAN ID 改成 100(actions=mod_vlan_vid:100)
從上面的網絡結構咱們可知,phy-br-eth1 鏈接的是 br-int,phy-br-eth1 的 inbound 包實際上就是 instance 經過 br-int 發送給物理網卡的數據。
那麼怎麼理解將 VLAN ID 1 改成 VLAN ID 100 呢?
請看下面計算節點 ovs-vsctl show 的輸出:
br-int 經過 tag 隔離不一樣的 port,這個 tag 能夠當作內部的 VLAN ID。
從 qvo4139d09b-30(對應 cirros-vm2,vlan100)進入的數據包會被打上 1 的 VLAN tag。
從 qvo98582dc9-db(對應 cirros-vm3,vlan101)進入的數據包會被打上 5 的 VLAN tag。
由於 br-int 中的 VLAN ID 跟物理網絡中的 VLAN ID 並不相同,因此當 br-eth1 接收到 br-int 發來的數據包時,須要對 VLAN 進行轉換。Neutron 負責維護 VLAN ID 的對應關係,並將轉換規則配置在 flow rule 中。
理解了 br-eth1 的 flow rule,咱們再來分析 br-int 的 flow rule。
最關鍵的是下面兩條:
priority=3,inport=1,dl_vlan=100 actions=mod_vlan_vid:1,NORMAL priority=3,inport=1,dl_vlan=101 actions=mod_vlan_vid:5,NORMAL
port 1 爲 int-br-eth1,那麼這兩條規則的含義就應該是:
1. 從物理網卡接收進來的數據包,若是 VLAN 爲 100,則改成內部 VLAN 1。
2. 從物理網卡接收進來的數據包,若是 VLAN 爲 101,則將爲內部 VLAN 5。
簡單的說,數據包在物理網絡中經過 VLAN 100 和 VLAN 101 隔離,在計算節點 OVS br-int 中則是經過內部 VLAN 1 和 VLAN 5 隔離。
控制節點的 flow rule 很是相似,留給你們分析。
到這裏,咱們已經完成了 Neutron OVS vlan 的學習,下節開討論 OVS 環境下的路由。