Openstack(icehouse)計算節點鏈路

計算節點虛擬機實例信息以下:html

NAME       NETWORK(fixed_ip,floating_ip)                fixed_ip_mac       device   
hyp-vm1    net-hyp=192.168.66.2          122.114.124.21 fa:16:3e:23:91:7b  tap156d4a84-8f
hyp-vm2    net-hyp=192.168.66.4          -              fa:16:3e:61:d8:b7  tap9b3f4311-42
liyang-vm  net-liyang0993=192.168.100.3  122.114.124.45 fa:16:3e:6c:c9:bb  tap0620d5f8-02

(虛擬機ip與網卡信息能夠從 dashboard 以及 計算節點的virsh管理工具 收集,此處略)linux

[root@compute home]# brctl show
bridge name    bridge id         STP enabled  interfaces
qbr0620d5f8-02 8000.e2ac0a53cb2b no           qvb0620d5f8-02  tap0620d5f8-02
qbr156d4a84-8f 8000.62f2e45acb48 no           qvb156d4a84-8f  tap156d4a84-8f
qbr9b3f4311-42 8000.9ea9c59ddd0b no           qvb9b3f4311-42  tap9b3f4311-42

虛擬機是直連linux bridge的,且每一個虛擬機擁有獨立的qbr.shell

qbr是neutron 安全組 具體實現的地方,留待專題說明.安全

而每一個 qbr的 qvb設備 都與 br-int上某對應qvo設備以對等設備的形式直連,參見下文:cookie

[root@compute home]# ovs-vsctl show
1db94f48-8307-4bad-b109-30897062c4e4
    """br-tun 信息略"""
    Bridge br-int
        fail_mode: secure
        Port patch-tun
            Interface patch-tun
                type: patch
                options: {peer=patch-int}
        Port br-int
            Interface br-int
                type: internal
        Port "qvo156d4a84-8f"
            tag: 2
            Interface "qvo156d4a84-8f"
        Port "qvo9b3f4311-42"
            tag: 1
            Interface "qvo9b3f4311-42"
        Port "qvo0620d5f8-02"
            tag: 2
            Interface "qvo0620d5f8-02"
    ovs_version: "2.4.0"

這裏舉例說明一下: 如何建立對等設備, linux網橋 , 開啓並設置對等接口的混雜模式,並設置屬主(add-port/addif to ovs/bridge)網絡

ip link add qvb0620d5f8-02 type veth peer name qvob0620d5f8-02
brctl add-br qbr0620d5f8-02
ifconfig qvb0620d5f8-02 promisc up 
ifconfig qvob0620d5f8-02 promisc up
ovs-vsctl add-port  br-int qvob0620d5f8-02 -- set Port qvob0620d5f8-02 tag=2
ovs-vsctl add-port  qbr0620d5f8-02  qvb0620d5f8-02

這樣就實現ovs虛擬交換機br-int與linux bridge - qbr 之間的鏈路互通 .
ide

在linux bridge(安全組網橋),br-int交換機,以及二者之間的鏈路創建以後咱們把注意力放在br-int對 虛擬機(liyang-vm,tap0620d5f8-02網卡的屬主)inbound/outbound流量的處理上.工具

咱們已經知道,在br-int上:
Port "qvo0620d5f8-02"
    tag: 2
    Interface "qvo0620d5f8-02"
那麼這些信息做何解釋? tag=2 是什麼? tag 指的是 vlan tag,經此端口的流量,出則mod_vlan_vid,入則 strip_vlan.可是VLAN ID爲何是2?
此處vlan tag 是本地vlan(在當前計算節點),而不是全局的(即整個集羣).學習

liyang-vm 鏈接的是私有網絡 net-liyang0993ui

[root@controller ~(keystone_admin)]# neutron net-list | grep liyang
| 6a169cca-282d-4bea-a99e-d725ac1721b9|net-liyang0993|1a7ed44b-e61d-4f98-aa47-d9123827acc2 
192.168.100.0/24|

[root@controller ~(keystone_admin)]# neutron net-show 6a169cca-282d-4bea-a99e-d725ac1721b9

+---------------------------+--------------------------------------+
| Field                     | Value                                |
+---------------------------+--------------------------------------+
| admin_state_up            | True                                 |
| id                        | 6a169cca-282d-4bea-a99e-d725ac1721b9 |
| name                      | net-liyang0993                       |
| provider:network_type     | vxlan                                |
| provider:physical_network |                                      |
| provider:segmentation_id  | 10                                   |
| router:external           | False                                |
| shared                    | False                                |
| status                    | ACTIVE                               |
| subnets                   | 1a7ed44b-e61d-4f98-aa47-d9123827acc2 |
| tenant_id                 | c9baab896503480b80919a4f0762dcf8     |
+---------------------------+--------------------------------------+

咱們知道該私有網絡 VLAN Tag 是根據配置的VNI範圍(參考 /etc/neutron/plugin.ini : vni_ranges =10:100) 選取的最小的可用值.
那麼我猜測鏈路中必須有 br-int port 的 vlan-tag 以及 後續的br-tun tunnel_id 以及 provider:segmentation_id 之間的轉換處理,留待後續探究.

接上文繼續探索 br-int,咱們查看 br-int 上的 flow rules:

[root@compute ~]# ovs-ofctl dump-flows br-int
NXST_FLOW reply (xid=0x4):
cookie=0x0, duration=145733.004s, table=0, n_packets=238070, n_bytes=37626893, 
idle_age=0, hard_age=65534, priority=1 actions=NORMAL
cookie=0x0, duration=145732.923s, table=22, n_packets=0, n_bytes=0, idle_age=65534,
hard_age=65534, priority=0 actions=drop

很日常的兩條流表規則:
(1) 根據優先級,優先對流量執行Normal轉發.
(2) table 的數值不一樣表明當前規則屬於不一樣的流表, 處理不一樣的流量 [ 流量歸類,按表批量處理 ] ;

而後咱們在看看br-int上的patch-tun,br-tun上的patch-int 端口.

ovs虛擬交換機之間的會連是經過 patch-ports 來實現的,下面舉例說明 br-int 如何與 br-tun如何實現鏈路互通.

[root@compute ~]#ovs-vsctl -- --if-exists del-port patch-tun -- add-port br-int \
                 patch-tun -- set Interface patch-tun type=patch options:peer=patch-int
[root@compute ~]#ovs-vsctl -- --if-exists del-port patch-int -- add-port br-tun \
                 patch-int -- set Interface patch-int type=patch options:peer=patch-tun

參考: http://blog.scottlowe.org/2012/11/27/connecting-ovs-bridges-with-patch-ports/
此處兩個互添 patch port 的語句將br-int 與 br-tun鏈接到一塊兒

接着繼續往下看 br-tun上的端口與flow rules(參考後文流表規則),先梳理一下再細說:

首先,br-tun上的ofport信息以下:

[root@compute home]# ovs-ofctl show br-tun
OFPT_FEATURES_REPLY (xid=0x2): dpid:000056bb20081443
n_tables:254, n_buffers:256
capabilities: FLOW_STATS TABLE_STATS PORT_STATS QUEUE_STATS ARP_MATCH_IP
actions: output enqueue set_vlan_vid set_vlan_pcp strip_vlan mod_dl_src 
mod_dl_dst mod_nw_src mod_nw_dst mod_nw_tos mod_tp_src mod_tp_dst
 1(patch-int): addr:12:cc:14:b8:9a:67
     config:     0
     state:      0
     speed: 0 Mbps now, 0 Mbps max
 2(vxlan-0aa0006b): addr:42:9e:52:f8:0c:9a
     config:     0
     state:      0
     speed: 0 Mbps now, 0 Mbps max
 LOCAL(br-tun): addr:56:bb:20:08:14:43
     config:     PORT_DOWN
     state:      LINK_DOWN
     speed: 0 Mbps now, 0 Mbps max
OFPT_GET_CONFIG_REPLY (xid=0x4): frags=normal miss_send_len=0

其次 , 須要瞭解, br-tun流表規則中不一樣的table 編號表示當前規則所屬的表,表示不一樣的做用.
具體詳見源碼(neutron/plugins/openvswitch/common/constants.py)說明:

PATCH_LV_TO_TUN = 1
GRE_TUN_TO_LV = 2
VXLAN_TUN_TO_LV = 3
LEARN_FROM_TUN = 10
UCAST_TO_TUN = 20
FLOOD_TO_TUN = 21
CANARY_TABLE = 22

而後咱們開動對br-tun上的流表規則的分析.

下面咱們逐條分析流表規則:

table=0,priority=1,in_port=1 actions=resubmit(,1)

若是是priority=1,table 0,且從ofport=1的端口進入的流量 從新提交到table 1處理

table=0,priority=1,in_port=2 actions=resubmit(,3)

若是是priority=1,table 0,且從ofport=1 的端口進入的流量 從新提交到table 3處理

table=0,priority=0 actions=drop

爲table 0設置默認流表規則:DROP

table=1,priority=1,dl_dst=00:00:00:00:00:00/01:00:00:00:00:00 actions=resubmit(,20)

若是是priority=1的單播(unicast)流量,那麼從新提交到 table 20處理.
dl_dst=01:00:00:00:00:00/01:00:00:00:00:00   匹配多播(含廣播) Ethernet幀
dl_dst=00:00:00:00:00:00/01:00:00:00:00:00   匹配單播 Ethernet幀

table=1,priority=1,dl_dst=01:00:00:00:00:00/01:00:00:00:00:00 actions=resubmit(,21)

若是是廣播流量那麼從新提交到table 21處理

table=2,priority=0 actions=drop

爲table 2設置默認流表規則:DROP

table=3,priority=1,tun_id=0xa actions=mod_vlan_vid:1,resubmit(,10)

若是是從網絡節點經vxlan隧道(隧道編號 0xa)傳到當前計算節點的流量,將其vlan修改成1,重提給 table 10處理.
特別說明: 此處創建了 tunnel_id 與 本地 vlan間的轉換關係即 tunnel 0xa 對應 local vlan(LV) 1.

table=3,priority=1,tun_id=0xb actions=mod_vlan_vid:2,resubmit(,10)

同上

table=3,priority=0 actions=drop

爲table 3設置默認流表規則:DROP

table=10,priority=1 actions=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_T
UN_ID[],output:NXM_OF_IN_PORT[]),output:1


此處開篇幅講解 ovs 的 `learn` action:
ovs-ofctl man手冊的說法是 將learn(**) 裏面的 ** 做爲一條流規則添加/修改
我的見解: 用以模仿物理交換機的學習功能,物理交換機的的通過學習知道對特定特徵的流量怎麼處理;而對應地ovs
這個虛擬交換機則是一條流表規則(匹配特定特徵的流量,並規定一個處理動做) ; 所以 ** 部分參數,至少包含一個匹配規則與一個action ;
learn 中匹配規則說明 示例:
NXM_OF_VLAN_TCI[0..11] 表示匹配 TCI信息的低12位,即VLAN ID域.
NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[] 表示學習當前數據包的mac地址.
output:NXM_OF_IN_PORT[] 表示 新加流表規則的處理出包的操做(將其再次從入口`ovs port`返回)
load:NXM_NX_TUN_ID[]->NXM_NX_TUN_ID[] 表示新加流表規則 處理出流量時會將其 tunnel id修改成當前流表的 tunnel id.
hard_timeout 表示交換機entry過時時間,通常 learn 必需要加選項,保證定時更新 entry;
如前所示,learn是在table 20(mac學習表)中動態添加flow,所以在table=20的全部flows中,符合格式"table=20,hard_timeout=300, priority=1,vlan_tci={tci}/{mask},dl_dst={mac} actions=load:0->NXM_OF_VLAN_TCI[],load:0xa->NXM_NX_TUN_ID[],output:{port}"的 流表都是經過學習動態添加的流表規則 ; 不符合該格式的流表是br-tun/table-20建立之初添加的初始流表,這是須要注意的地方.

參考:
http://www.tuicool.com/articles/am6n2iB
http://www.cnblogs.com/CasonChan/p/4754486.html
http://www.cnblogs.com/popsuper1982/p/3810271.html
http://blog.csdn.net/gaopeiliang/article/details/45720785
http://m.blog.csdn.net/blog/canxinghen/46761591

table=20,priority=1,vlan_tci=0x0001/0x0fff,dl_dst=fa:16:3e:c3:23:47 
actions=load:0->NXM_OF_VLAN_TCI[],load:0xa->NXM_NX_TUN_ID[],output:2

table=20,priority=1,vlan_tci=0x0002/0x0fff,dl_dst=fa:16:3e:11:3f:0f 
actions=load:0->NXM_OF_VLAN_TCI[],load:0xb->NXM_NX_TUN_ID[],output:2


匹配 table=20,priority=1,vlan id=2 且訪問私有網絡網關(虛擬路由 qrouter-e0014375-0cb7-44b1-84cb-f7f49dd59344下內網網關 qr-f7f87f9f-54 mac fa:16:3e:11:3f:0f )的流量.

`load` 是什麼處理?  load:src[start:end]->dst[start:end] 或 load:value-> dst[start:end]
 做用就是將 load後的第一個參數(->前) 或 參數按(start1:end1)位取出的部分 加載入 第二個參數的start2:end2 (賦值操做);
下面說兩個 Ethernet 幀中的 特殊域:
NXM_OF_VLAN_TCI:VLAN幀的tci域,2字節,見下文;此處 load:0->NXM_OF_VLAN_TCI[] 表示清空(priority,cfi,vlan-id),即strip_vlan;
NXM_NX_TUN_ID: Ethernet網幀的tunnel-id域; 此處 load:0xb->NXM_NX_TUN_ID[] 表示設置 tunnel id 爲0xb ,跟後文set_tunnel:0xb 同樣,我的猜測應該是ovs版本歷史變動問題致使的兩種形式並存;


此處開篇幅細說 vlan_tci:
首先什麼是vlan tci ? (引自 http://blog.csdn.net/kulung/article/details/6442804)
VLAN-TAG 包含2字節的 TPID(標籤協議標識) 以及 2字節的 TCI(標籤控制信息)
TPID 標識 IEEE 類型,常見的格式是: 802.1Q, 802.{N}{A..Z};
TCI 信息又包含 子域 信息:
 priority :  3bit ,表示0-7 優先級;
 cfi,即 Canonical Format Indicator 佔1bit ,0表示規範,1表示不規範;
 vlan id: 佔12bit 表示 0~4095,這就是 vlan 最多 4096個的緣由 ;

回頭看此處 vlan_tci 表示的是 {tci}/{mask} 格式,那這是什麼意思呢? ovs-ofctl man 手冊解釋說: tci與mask 位數
相同(16bit)且 mask的每bit 控制 流表 匹配tci對應bit時使用的的匹配機制:精準匹配或模糊匹配(wildcast,等於*)
那麼此處  0x0002/0x0fff 表示精確匹配vlan id=2(0x0fff : 後12位 fff),不限制格式(0x0fff: 中間的一位是0表示不限格式, 0x0fff高3位全0,表示0-7優先級的幀皆可匹配) 的 vlan幀 ;


繼續 :

table=20,priority=0 actions=resubmit(,21)

爲table 20設置默認流表規則: 從新提交到 table 21處理

table=21,dl_vlan=1 actions=strip_vlan,set_tunnel:0xa,output:2

若是是從 br-int 送入 br-tun的流量 , vlan tag=1 那麼去vlan-tag 且設置tunnel_id 0xa 輸出到 ofport=2的端

口(即隧道端口 )

table=21,dl_vlan=2 actions=strip_vlan,set_tunnel:0xb,output:2

若是是從 br-int 送入 br-tun的流量 , vlan tag=2 那麼去vlan-tag 且設置tunnel_id 0xb 輸出到 ofport=2的端

口(即隧道端口)

table=21,priority=0 actions=drop

爲table 21設置默認流表規則:DROP

br-tun流表至此算是講解完了, 那麼br-tun 的流表規則表達的是一套怎樣的數據處理系統呢? 能夠參考下圖:

那麼此處再講解 計算節點與網絡節點之間vxlan隧道的創建:

[root@compute neutron]# ovs-vsctl -- --if-exists del-port vxlan-0aa0006b -- add-port \
                        br-tun vxlan-0aa0006b -- set Interface vxlan-0aa0006b type=vxlan \ 
                        options:remote_ip=10.160.0.107 options:in_key=flow  \ 
                        options:out_key=flow    options:local_ip=10.160.0.106
[root@network neutron]# ovs-vsctl -- --if-exists del-port vxlan-0aa0006a -- add-port \
                        br-tun vxlan-0aa0006a -- set Interface vxlan-0aa0006a type=vxlan \
                        options:remote_ip=10.160.0.106 options:in_key=flow  \
                        options:out_key=flow    options:local_ip=

其中: compute/10.160.0.106 network/10.160.0.107 皆爲相關節點的管理ip.

相關文章
相關標籤/搜索