1. 程式人生 > >OpenStack計算節點上虛擬網路(Neutron)詳解

OpenStack計算節點上虛擬網路(Neutron)詳解

場景(一個租戶,兩個網路,一個路由,內部網路使用GRE,Libvirt VIF Driver使用LibvirtHybridOVSBridgeDriver):

場景一虛擬網路拓撲

場景一虛擬網路拓撲

Figure 11 場景一虛擬網路拓撲

如圖我們有一個外網(External Network),IP段為172.16.0.0/16,兩個內網,分別是Internal:10.18.0.0/24,和Internal2:10.22.22.0/24,值得注意的是這是兩個網路(network),而不是子網(subnet)。

在這個場景下,計算節點的內部應當是這樣的:

計算節點網路連線原理

計算節點網路連線原理

下面我將解釋如何得到這幅圖。首先我們看下我們的虛擬機器在libvirt的名稱,通過 nova show 命令我們大概可以獲得像這樣輸出(擷取前半部分):

+--------------------------------------+-------------------------------

|

| Property                             | Value                                                    |

+--------------------------------------+-------------------------------

| Internal network                     | 10.18.0.3, 172.16.19.232                                 |

| OS-DCF:diskConfig                    | MANUAL                                                   |

| OS-EXT-AZ:availability_zone          | nova                                                     |

| OS-EXT-SRV-ATTR:host                 | compute1                                                 |

| OS-EXT-SRV-ATTR:hypervisor_hostname  | compute1                                                 |

| OS-EXT-SRV-ATTR:instance_name        | instance-0000001e                                        |

我們看到這臺虛擬機器被部署在compute1節點上,instance_name為instance-0000001e,我們上compute1節點使用virsh dumpxml將instance-0000001e的資訊打印出來(擷取網路相關):

    <interface type='bridge'><mac address='fa:16:3e:e9:26:5a'/> <source bridge='qbr48e06cd2-60'/> <target dev='tap48e06cd2-60'/> <model type='virtio'/> <alias name='net0'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </interface>

在這裡我們看到這臺虛擬機器的網路裝置是tap48e06cd2-60,而且似乎連到了qbr48e06cd2-60上,讓我們用brctl show再看下(擷取相關部分):

qbr48e06cd2-60       8000.bed5536ff312 no     qvb48e06cd2-60tap48e06cd2-60

看到這裡網橋qbr48e06cd2-60上接了兩個介面,qvb48e06cd2-60和tap48e06cd2-60,其中的tap裝置是我們虛擬機器使用的虛擬網路裝置,那qvb48e06cd2-60是什麼?我們先用lshw –class network把所有網路裝置打印出來(擷取相關部分):

  *-network:5description: Ethernet interface physical id: 7 logical name: qvb48e06cd2-60 serial: be:d5:53:6f:f3:12 size: 10Gbit/s capabilities: ethernet physical configuration: autonegotiation=off broadcast=yes driver=veth driverversion=1.0 duplex=full firmware=N/A link=yes multicast=yes port=twisted pair promiscuous=yes speed=10Gbit/s

我們注意到這裡顯示這個裝置的driver是veth,而veth總是成對出現的,我們用ethtool -S 看下這個veth的另一端連到了那裡:

# ethtool -S qvb48e06cd2-60NIC statistics: peer_ifindex: 16

OK,看下16號是哪個裝置,ip link(擷取相關部分):

16: qvo48e06cd2-60: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000link/ether aa:c0:0f:d2:e2:43 brd ff:ff:ff:ff:ff:ff

通過上面兩個步驟我們已經知道了這對從虛擬機器的網路裝置到veth pair這個流程,這個過程在官方文件中針對不同的 Libvirt VIF Driver有不同的簡單的描述,見    https://wiki.openstack.org/wiki/LibvirtVIFDrivers     。 

下面應該是連到Open vSwitch上吧,讓我們驗證下:

# ovs-vsctl show
1910d375-2692-4214-acdf-d364382c25a4
Bridge br-int
Port br-int
Interface br-int
type: internal
Port patch-tun
Interface patch-tun
type: patch
options: {peer=patch-int}
Port "qvo48e06cd2-60"
tag: 1
Interface "qvo48e06cd2-60"
Port "qvodfdc29e2-9a"
tag: 2
Interface "qvodfdc29e2-9a"
Port "qvo18cec000-80"
tag: 2
Interface "qvo18cec000-80"
Port "qvob86d15f1-8f"
tag: 1
Interface "qvob86d15f1-8f"
Bridge br-tun
Port br-tun
Interface br-tun
type: internal
Port patch-int
Interface patch-int
type: patch
options: {peer=patch-tun}
Port "gre-1"
Interface "gre-1"
type: gre
options: {in_key=flow, local_ip="192.168.10.11", out_key=flow, remote_ip="192.168.10.10"}
ovs_version: "1.11.0"

果然qvo48e06cd2-60是連到了br-int上, OpenStack採用這麼複雜的機制,而不是把tap裝置直接連到Open vSwitch上,這與安全組有關,將在3.2.4基於iptables的Security Group介紹。

在研究到OVS內部前,我們先注意下在poty “qvo48e06cd2-60”下有一個“tag: 1”,這個tag是Open vSwitch用來區分不同子網的。在這裡,tag1表示我們的10.18.0.0/24子網,tag2表示10.22.22.0/24子網。

br-int和br-tun通過patch連線,在官方文件上patch的介紹並不多,但一旦兩個OVS網橋通過網橋連線,這兩個網橋將近乎為同一個網橋,參考資料見:    Open vSwitch FAQ     和    Connecting OVS Bridges with Patch Ports     。 

首先看下bt-int的流表規則:

# ovs-ofctl dump-flows br-intNXST_FLOW reply (xid=0×4):         

cookie=0×0, duration=246746.016s, table=0, n_packets=702, n_bytes=78521, idle_age=1324, hard_age=65534, priority=1 actions=NORMAL

只有一個NORMAL的動作,在Open vSwitch的官方文件裡解釋為將包以傳統的,非OpenFlow的方式進行交換,也就是說效果和沒設定OpenFlow規則一樣(見    Open vSwitch Advanced Features Tutorial     )。那麼我們分析br-tun的流表規則,首先在計算節點上用ovs-ofctl dump-ports-desc檢視br-tun上所有介面: 

OFPST_PORT_DESC reply (xid=0x2):1(patch-int): addr:ea:a2:71:f5:9f:ad config:     0 state:      0 speed: 0 Mbps now, 0 Mbps max 2(gre-1): addr:d6:89:b0:03:d2:72 config:     0 state:      0 speed: 0 Mbps now, 0 Mbps max LOCAL(br-tun): addr:9a:49:9a:35:d1:4e config:     0 state:      0 speed: 0 Mbps now, 0 Mbps max

然後用ovs-ofctl dump-flows或者EasyOVS檢視br-tun的流表規則(這裡使用EasyOVS使排版相對好看):

ID TAB PKT       PRI   MATCH                                                       ACT

0  0   339       1     in=1                                                        resubmit(,1)

1  0   285       1     in=2                                                        resubmit(,2)

2  0   3         0     *                                                           drop

3  1   216       0     dl_dst=00:00:00:00:00:00/01:00:00:00:00:00              resubmit(,20)

4  1   123       0     dl_dst=01:00:00:00:00:00/01:00:00:00:00:00              resubmit(,21)

5  10  363       1     *                                                           learn(table=20,hard_timeout=300,priority=1,NXM_OF_VLAN_TCI[0..11],NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],load:0->NXM_OF_VLAN_TCI[],load:NXM_NX_TUN_ID[]->NXM_NX_TUN_ID[],output:NXM_OF_IN_PORT[]),output:1

6  2   341       1     tun_id=0x2                                             mod_vlan_vid:1,resubmit(,10)

7  2   17        1     tun_id=0x3                                             mod_vlan_vid:2,resubmit(,10)

8  2   3         0     *                                                           drop

9  20  0         0     *                                                           resubmit(,21)

10 21  3         1     vlan=2                                          strip_vlan,set_tunnel:0x3,output:2

11 21  16        1     vlan=1                                          strip_vlan,set_tunnel:0x2,output:2

12 21  4         0     *                                                            drop

13 3   0         0     *                                                            drop

這裡為了好看只顯示了ID、表名、計數器、匹配規則和行為。先看這幾條流:0、3、4、9、10、11、12,這些流定義了從br-int進入的包的行為,逐條從上往下看:

0. 表0:當匹配到從port 1(patch-int)進入的包時,提交給表1繼續匹配;3. 表1:當目標MAC地址為單播地址時,提交給表20繼續匹配;         

4. 表1:當目標MAC地址為多播/廣播地址時,提交給表21繼續匹配;、

9. 表20:提交給21繼續匹配(這個表並非只是轉發,當OVS根據表10動態建立自動學習的規則時,會新增到表20,比如下面這條流表規則是自動建立的目標MAC地址為路由的規則:“cookie = 0×0, duration = 11.099s, table = 20, n_packets = 45, n_bytes = 6132, hard_timeout = 300, idle_age = 3, hard_age = 2, priority = 1,vlan_tci = 0×0001/0x0fff,dl_dst = fa:16:3e:a1:3f:19 actions = load:0 -> NXM_OF_VLAN_TCI[], load:0×2 -> NXM_NX_TUN_ID[], output:2”);

10. 表21:當目標VLan標籤為2時,剝去VLan標籤,然後將Tunnel Key設定為3(GRE通道的Key,詳見            rfc2890             的相關描述)並從port 2(gre-1)發出去;         

11. 表21:當目標VLan標籤為1時,剝去VLan標籤,然後將Tunnel Key設定為2並從port 2(gre-1)發出去;

12. 表21:對沒成功匹配的包,丟棄。

再看1、6、7、5,這幾個流定義了來自GRE通道(Network節點)的包的行為:

1. 表0:當匹配到從port 2(gre-1)進入的包時,提交給表2繼續匹配;6. 表2:當Tunnel Key為2時,新增VLan tag 1,提交給表10繼續匹配;         

7. 表2:當Tunnel Key為3時,新增VLan tag 2,提交給表10繼續匹配;

5. 表10:首先從報文中學習VLan、MAC等資訊並把規則新增表20,然後再從port 1(patch-int)發出去。

至此,計算節點的網路分析已經基本完成。後面到網路節點的連線等主要涉及到3層路由,暫且不表。

相關推薦

OpenStack計算節點虛擬網路Neutron

場景(一個租戶,兩個網路,一個路由,內部網路使用GRE,Libvirt VIF Driver使用LibvirtHybridOVSBridgeDriver): 場景一虛擬網路拓撲 Figure 11 場景一虛擬網路拓撲 如圖我們有一個外網(External Network)

OpenStack-liberty版Nova計算節點部署服務部署

noop mov byte dom man grep -E 服務 修改 c99 Nova Compute:nova-compute 一般運行在計算節點上,通過Message Queue接收並管理VM的生命周期。Nova-compute通過Libvirt管理KVM,通過Xen

有效防止softmax計算溢出overflow和下溢出underflow的方法

play over 這樣的 第四章 AC alt ref 溢出 數值計算 《Deep Learning》(Ian Goodfellow & Yoshua Bengio & Aaron Courville)第四章「數值計算」中,談到了上溢出(overflo

如何在Exadata計算節點擴充套件磁碟空間驅動(文件 ID 1582139.1)

適用版本: Exadata X2-2  Exadata X3-2   目的: 在Exadata計算節點擴充套件磁碟空間(驅動) 在Exadata升級後或者增加新的空間到/u01 或者建立新的檔案系統 /u01 詳細: 檢查物理卷的大小 [[email prot

OVS初級教程:使用open vswitch構建虛擬網路轉載

一、open vswitch簡介 Open vSwitch是一個高質量的、多層虛擬交換機,使用開源Apache2.0許可協議,由Nicira Networks開發,主要實現程式碼為可移植的C程式碼。它的目的是讓大規模網路自動化可以通過程式設計擴充套件,同時仍然支援標準的管理介面和協議(例如NetFl

selenium藉助AutoIt識別下載

From: http://www.cnblogs.com/fnng/p/4188162.html AutoIt目前最新是v3版本,這是一個使用類似BASIC指令碼語言的免費軟體,它設計用於Windows GUI(圖形使用者介面)中進行自動化操作。它利用模擬鍵盤按鍵,滑鼠移動和視窗/控制元件的組合來

GoLang基礎數據類型--->字典map

golang ont nbsp spa 數據 否則 創作 聲明 作者                          GoLang基礎數據類型--->字典(map)詳解                                                 

SQL語句之數據定義語言DDL

三種 absolute row redundant 字符 對象 not null 工作 part 操作對象:數據庫 1)創建數據庫 MariaDB [(none)]> help create databaseName: ‘CREATE DATABASE‘Descrip

指標1-- 軌道線指標ENE

本質 平均值 width 簡單 公式 方向 重新 alt 改變 軌道線指標(ENE): 1、定義:軌道線(ENE)由上軌線(UPPER)和下軌線(LOWER)及中軌線(ENE)組成,軌道線的優勢在於其不僅具有趨勢軌道的研判分析作用,也可以敏銳的覺察股價運行過程中方向的改

指標5-- 布林線指標BOLL

tar 線下 pan evel 隨著 向上 log link bsp 一、定義:布林線指標,即BOLL指標,其英文全稱是“Bollinger Bands”,布林線(BOLL)由約翰·布林先生創造,其利用統計原理,求出股價的標準差及其信賴區間,從而確定股價的波動範圍及未來走勢

GoLang基礎資料型別--->字典map

                     GoLang基礎資料型別--->字典(map)詳解                                             作者:尹正傑 版權宣告:原創作品,謝絕轉載!否則將追究法律責任。  

linux 之mysql——約束constraint

一、什麼是約束 約束英文:constraint 約束實際上就是表中資料的限制條件 二、約束作用 表在設計的時候加入約束的目的就是為了保證表中的記錄完整和有效性 比如name欄位中要讓其使用者名稱不重複,這就需要新增約束。或者必須註冊的時候需要新增郵箱等  三、約束種類

c++迭代器iterator【轉】

(轉自:https://www.cnblogs.com/hdk1993/p/4419779.html) 1. 迭代器(iterator)是一中檢查容器內元素並遍歷元素的資料型別。 (1) 每種容器型別都定義了自己的迭代器型別,如vector: vector<int>::it

HttpURLConnection

(轉)詳解HttpURLConnection 請求響應流程 設定連線引數的方法     setAllowUserInteraction setDoInput setDoOutput setIfModifiedSince se

SpringMVC學習 Dispatcher

前端控制器 Dispatcherservlet 截獲請求後做了什麼工作呢?DispatcherServlet 又是如何分派請求的呢? 分析DispatcherServlet 原始碼如下: protected void initStrategies(ApplicationContext

自動化監控--zabbix中的Macros巨集

巨集 Zabbix支援許多在多種情況下使用的巨集。巨集是一個變數,由如下特殊語法標識: {MACRO} 根據在上下文中, 巨集解析為一個特殊的值。有效地使用巨集可以節省時間,並使Zabbix變地更加高效。 在一個的典型用途中,巨集可以用於模板中。因此,模板的觸發器可能

自動化監控--zabbix中的template模板

模板概述 模板是可以方便地應用於多個主機的一組實體。而這些實體包括:items(監控項)、triggers(觸發器),graphs(圖形)、applications(應用)、screens (聚合圖形(自Zabbix 2.0起))、low-level discovery rules

C#泛型 C#泛型 C#泛型

  一、前面兩篇文章分別介紹了定義泛型型別、泛型委託、泛型介面以及宣告泛型方法:   詳解C#泛型(一)   詳解C#泛型(二)   首先回顧下如何構建泛型類: public class MyClass<T> { public void MyFunc() {

歸併排序MergeSort和動畫

歸併排序演算法思想:將陣列不斷二分得到子陣列,知道子陣列長度為1(自然是排序好的),對左子陣列和右子陣列分別排序, 子陣列長度為1,2,4...., 子陣列排序使用了一個輔助陣列 def exchange(arr,i,j): temp=arr[i] arr[i]=arr[

快速排序Quicksort(動畫程式碼)

快速排序只一種基於分治策略(divide and conquer)的經典排序演算法,並且是一種原地(in-place)排序,實現原地排序的依據是用兩個陣列下標(start,end)來確定當前待排序子陣列的範圍。 切分(partition)步驟(關鍵): 在對子陣列進行排序時,本質上是在確定子