轉載自:https://blog.csdn.net/weixin_45537413/article/details/109439837
1、網絡架構
openvswitch與linux-bridge相比較而言,openvswitch支持的網絡類型更加豐富,應用也比較廣泛,因此圖示直接使用OVS。linux-bridge支持local, flat, vlan和vxlan 四種network type,目前不支持gre,相比較而言openvswitch支持GRE網絡;
OpenStack 至少包含下面幾類網絡流量
- Management:節點之間 message queue 內部通信以及訪問 database 服務;
- API:通過該網絡向用戶暴露 API 服務;(下圖中API網絡和管理網絡合為一體)
- VM:VM 網絡由 Neutron 配置和管理;
- External:External 網絡指的是 VM 網絡之外的網絡,該網絡不由 Neutron 管理;
管理網絡:用戶管理所有節點的網絡;
內部網絡:計算節點與網絡節點通過內部網絡通信,tenant network(租戶網絡,租戶自己創建管理,網絡之間可以重合);
外部網絡:內部的VM與外部物理網絡間使用外部網絡通信使用,一般由管理員創建並賦予相應屬性,稱為public network(或者叫provider network?);
2、neutron模塊
主要包含以下幾個部分:
(1)neutron-server:可以理解為類似於nova-api那樣的一個組件,一個專門用來接收neutron REST API調用的服務器。負責將不同的rest api發送到不同的neutron-plugin。接受和路由API請求到網絡plug-in。一般部署在控制節點(controller),負責通過Neutron-server響應的API請求;
(2)neutron-plugin:可以理解為不同網絡功能(例如創建端口(ports)、網絡(Networks)、子網(Subnets)等)實現的入口,現在大部分都是軟件定義網絡,各個廠商都開發自己的plugin(插件)。neutron-plugin接收netron-server發過來的rest api,向neutron database完成一些信息注冊(比如用戶要建端口)。然后將具體要執行的業務操作和參數通知給自身對應的neutron-agent。Openstack的plug-ins一般支持Open vSwitch、Linux Bridging、思科物理/虛擬交換機等等。一般Core plugin 和service plugin已經集成到neutron-server中,不需要運行獨立的plugin服務。
(3)agent:常見的agent包括L3、DHCP、plug-in agent;一般網絡節點需要部署Core Plugin的代理和service Plugin的代理,計算節點也需要部署Core Plugin的代理,通過該代理才能建立二層連接。
(4)messaging queue:在neutron-server和agents之間路由信息,同時作為一個數據庫存儲plug-ins的網絡狀態;
模塊之間調用關系:(此段為摘抄內容)
(5)Client(客戶端)是指使用Neutron服務的應用程序,可以是命令行工具(腳本)、Horizon和Nova計算服務等;
(6)Neutron-database(數據庫,默認使用MariaDB)用於存放OpenStack的網絡狀態信息,包括網絡、子網、端口、路由器等;
(7)network provider:提供網絡服務的物理或者虛擬網絡設備,例如 Linux Bridge,Open vSwitch 或者其他支持 Neutron 的物理交換機;
舉列說明:創建一個Vlan 10虛擬網絡的流程。
- 1、Neutron-server 收到創建網絡(Network) 的請求,通過消息隊列(RabbitMQ)通知已注冊的Linux Bridge插件,這里架設網絡提供者為Linux Bridge。
- 2、該插件將要創建的網絡信息(如名稱、ID值、VLANID等)保存到數據庫中並通過消息隊列通知運行在各個節點上的代理。
- 3、代理收到信息后會在節點上物理網卡上創建Vlan設備(比如物理接口的子接口 Eth1.10),並創建一個網橋(比如brgXXX)來橋接網絡設備。
2.1 plugin
幾點說明:
- plugin 解決的是 What 的問題,即網絡要配置成什么樣子?而至於如何配置 How 的工作則交由 agent 完成。
- plugin,agent 和 network provider 是配套使用的,如果network provider用的linux bridge則使用對應的plugin和agent,若是使用的OVS則使用OVS的plugin和agent;
- plugin 的一個主要的職責是在數據庫中維護 Neutron 網絡的狀態信息。通過ML2(Modular Layer 2)plugin,各種 network provider 無需開發自己的 plugin,只需要針對 ML2 開發相應的 driver 就可以了;
- plugin 按照功能分為兩類: core plugin 和 service plugin。core plugin 維護 Neutron 的 netowrk, subnet 和 port 相關資源的信息,與 core plugin 對應的 agent 包括 linux bridge, OVS 等; service plugin 提供 routing, firewall, load balance 等服務,也有相應的 agent。
2.2 agent
neutron的agent及相應功能
agent | 描述 |
---|---|
L3 agent (neutron-l3-agent) | 提供L3/NAT轉發(路由器),提供租戶不同vpc之間的訪問以及提供外部網絡訪問,openstack queens 版本之前是集中式的(即 l3 agent 部署在網絡節點上,把網絡節點作為虛擬路由器),存在性能瓶頸,queens 版本開始支持分布式(即 l3 agent 運行在所有計算節點上,把計算節點作為分布式虛擬路由器) |
dhcp agent (neutron-dhcp-agent) | 為租戶網絡提供dhcp功能,dhcp-agent默認的dhcp driver由dnsmasq軟件實現 |
metering agent (neutron-metering-agent) | 提供L3數據流量的監控、計算 |
metadata agent | 是提供一個機制給用戶,可以設定每一個instance 的參數 |
OpenvSwitch agent | 使用Open vSwitch來實現VLAN, GRE,VxLAN來實現網絡的隔離,還包括了網絡流量的轉發控制 |
plug-in agent ( neutron-*-agent ) | 在每個hypervisor上運行以執行本地vSwitch配置。 這個插件是否運行取決於使用的插件,有些插件不需要代理。 |
neutron-lbaas-agent | 提供LB的服務 |
neutron-firewall-agent | 提供防火牆服務 |
2.3 neutron的兩種部署方式
core plugin和service plugin都已集成到neutron server中,不需要單獨部署。
方式一:控制節點+計算節點
- 控制節點:部署的服務包括:neutron server, core plugin 的 agent 和 service plugin 的 agent;
- 計算節點:部署 core plugin 的agent,負責提供二層網絡功能;
說明:(1)控制節點和計算節點都需要部署 core plugin 的 agent,因為通過該 agent 控制節點與計算節點才能建立二層連接;(2)可以部署多個控制節點和計算節點;
方式二:控制節點+網絡節點+計算節點
- 控制節點:部署的服務包括:neutron server;
- 網絡節點:core plugin 的 agent 和 service plugin 的 agent;
- 計算節點:部署 core plugin 的agent,負責提供二層網絡功能;
說明:方式二更適合大規模的openstack環境,控制與網絡節點分離開,控制節點只通過neutron server響應API請求,然后調用網絡節點的plugin插件;網絡節點單獨拿出來負責數據的交換,路由以及 load balance等高級網絡服務。
2.4 neutron server
整體架構:neutron=API+plugin
- Core API:對外提供管理 network, subnet 和 port 的 RESTful API。
- Extension API:對外提供管理 router, load balance, firewall 等資源 的 RESTful API。
- Commnon Service:認證和校驗 API 請求。
- Neutron Core:Neutron server 的核心處理程序,通過調用相應的 Plugin 處理請求。
- Core Plugin API:定義了 Core Plgin 的抽象功能集合,Neutron Core 通過該 API 調用相應的 Core Plgin。
- Extension Plugin API:定義了 Service Plgin 的抽象功能集合,Neutron Core 通過該 API 調用相應的 Service Plgin。
- Core Plugin:實現了 Core Plugin API,在數據庫中維護 network, subnet 和 port 的狀態,並負責調用相應的 agent 在 network provider 上執行相關操作,比如創建 network。
- Service Plugin:實現了 Extension Plugin API,在數據庫中維護 router, load balance, security group 等資源的狀態,並負責調用相應的 agent 在 network provider 上執行相關操作,比如創建 router。
調用關系:通過儀表盤/腳本/Nova調用plugin,plugin再調用對應的agent;
neutron網絡的開放性:支持多種network provider。只需要不同的netwrok provider開發出對應的plugin和agent既可。但弊端是(1)只能在 OpenStack 中使用一種 core plugin;(2)不同plugin之間代碼重復率高,開發難度大。ML2 Core Plugin解決了傳統Core Plugin的這個問題。
2.4.1 ML2 Core Plugin
使用ML2 Core Plugin的需求是:(1)傳統Core Plugin無法同時提供多種network provider;(2)開發工作量大。
采用 ML2 plugin 后,可以在不同節點上分別部署 linux bridge agent, open vswitch agent, hyper-v agent 或其他第三方 agent。ML2 不但支持異構部署方案,同時能夠與現有的 agent 無縫集成:以前用的 agent 不需要變,只需要將 Neutron server 上的傳統 core plugin 替換為 ML2。
ML2 對二層網絡進行抽象和建模,引入了 type driver 和 mechansim driver。type driver 負責維護網絡類型的狀態,執行驗證,創建網絡等,支持vlan、vxlan、gre、flat、local網絡;mechanism driver 負責獲取由 type driver 維護的網絡狀態,並確保在相應的網絡設備(物理或虛擬)上正確實現這些狀態。
mechanism driver 有三種類型:(1)Agent-based:包括 linux bridge, open vswitch 等。(2)Controller-based:包括 OpenDaylight, VMWare NSX 等。(3)基於物理交換機;此外,涉及L2 population driver,其作用是優化和限制 overlay 網絡中的廣播流量。
2.4.2 Service Plugin / Agent
Core Plugin/Agent 負責管理核心實體:net, subnet 和 port。而對於更高級的網絡服務(防火牆、router、LB等),則由 Service Plugin/Agent 管理。
- DHCP:dhcp agent 通過 dnsmasq 為 instance 提供 dhcp 服務;
- Routing:l3 agent 可以為 project(租戶)創建 router;
- Firewall:l3 agent 可以在 router 上配置防火牆策略;
- Load Balance:Neutron 默認通過 HAProxy 為 project 中的多個 instance 提供 load balance 服務;
2.4.3 neutron架構的小結
如下圖:
- Neutron server 接收 api 請求。
- plugin/agent 實現請求。
- database 保存 neutron 網絡狀態。
- message queue 實現組件之間通信。
更深入的理解:
- Neutron 通過 plugin 和 agent 提供的網絡服務。
- plugin 位於 Neutron server,包括 core plugin 和 service plugin。
- agent 位於各個節點,負責實現網絡服務。
- core plugin 提供 L2 功能,ML2 是推薦的 plugin。
- 使用最廣泛的 L2 agent 是 linux bridage 和 open vswitch。
- service plugin 和 agent 提供擴展功能,包括 dhcp, routing, load balance, firewall, vpn 等。
2.5 linux bridge實現neutron網絡
2.5.1 linux-bridge mechanism driver
neutron默認使用ml2的service plugin,這個在配置文件有體現:
vi /etc/neutron/neutron.conf
[DEFAULT]
rpc_backend = rabbit
core_plugin = ml2
......
需要在控制節點與計算節點中指定的/etc/neutron/plugins/ml2/ml2_conf.ini的文件中將mechanism_drivers設定為openvswitch或者linux bridge,可以寫多個,ML2 會負責加載
[ml2]
type_drivers = vlan,vxlan
tenant_network_types = vlan,vxlan
mechanism_drivers = ml2_h3c,openvswitch
......
2.5.2 linux bridge中的幾種網絡設備和網絡類型
在 linux bridge 環境中,存在下面的網絡設備類型(不同的網絡里不一樣):
- tap interface命名為 tapN (N 為 0, 1, 2, 3......)
- linux bridge命名為 brqXXXX。
- vlan interface命名為 ethX.Y(X 為 interface 的序號,Y 為 vlan id),存在vlan網絡;
- vxlan interface命名為 vxlan-Z(z 是 VNI),vxlan網絡;
- 物理 interface命名為 ethX(X 為 interface 的序號)
linux-bridge 支持 local, flat, vlan 和 vxlan 四種 network type,目前不支持 gre。
2.5.3 Local Netwrok
local network 的特點是不會與宿主機的任何物理網卡相連,因此該宿主機上的VM不能與宿主機外部的網絡通信,完全隔離。對於每個 local netwrok,ML2 linux-bridge 會創建一個 bridge,instance 的 tap 設備會連接到 bridge。對於同一個bridge,其下的instance屬於同一個Local network,每個instance通過各自的tap設備連接到bridge,從可以互相通信。不同bridge之間不能相互通信。網絡架構如下圖所示:
配置文件中需要配置type_drivers的類型有local,/etc/neutron/plugins/ml2/ml2_conf.ini,並設置普通租戶創建的網絡類型(admin用戶可以指定網絡類型)
[ml2]
type_drivers = vlan,vxlan
tenant_network_types = vlan,vxlan
mechanism_drivers = ml2_h3c,openvswitch
extension_drivers = ml2_extension_h3c
......
通過WEB GUI創建相應的虛機VM,會自動創建一個port,該port信息包含ip和mac。宿主機根據該port信息創建相應tap設備,tap會關聯相應的bridge,同時映射成虛機的虛擬網卡(VIF)。
總結幾點:
-
- 位於同一 local network 的 instance 可以通信。
-
- 位於不同 local network 的 instance 無法通信。
-
- 一個 local network 只能位於一個物理節點,無法跨節點。
由於其只限制在單個宿主機中通信,無法跨網絡和跨主機,在實際的應用中基本很少用到local network,可以僅作為后續學習復雜網絡的基礎。
2.5.4 Flat Network
flat network 是不帶 tag 的網絡,要求宿主機的物理網卡直接與 linux bridge 連接,並且flat network與網卡是一一對應的關系,網絡架構如下圖所示。
同樣,配置文件中需要配置type_drivers的類型為flat網絡,/etc/neutron/plugins/ml2/ml2_conf.ini,並設置普通租戶創建的網絡類型(admin用戶可以指定網絡類型)
[ml2]
type_drivers = flat
tenant_network_types = flat
......
此外還需要定義flat網絡的標簽(標簽可以為任意字符串,需要保證控制和節點的命名保持一致,且后續在創建flat網絡時也需要填寫該標簽),並制定標簽與網卡之間的對應關系(各個計算節點的標簽必須一致,但標簽網卡對應關系可以不同。可以填寫多個標簽與各網卡之間一一對應,之間用逗號隔開,因此也就是對應多塊網卡):
2.5.5 DHCP服務
Neutron 提供 DHCP 服務的組件是 DHCP agent。DHCP agent 在網絡節點運行上,默認通過 dnsmasq 實現 DHCP 功能。
DHCP agent 的配置文件位於 /etc/neutron/dhcp_agent.ini。(正常來說一般不需要什么特殊配置)
- dhcp_driver:使用 dnsmasq 實現 DHCP。
- interface_driver:使用 linux bridge 連接 DHCP namespace interface。
dnsmasq 是一個提供 DHCP 和 DNS 服務的開源軟件。一般一個dnsmasp進程對應一個network,可以為該network內開啟了dhcp服務的所有subnet提供服務。DHCP agent 會為每個 network 創建一個目錄 /opt/stack/data/neutron/dhcp/,用於存放該 network 的 dnsmasq 配置文件。
dnsmasq 重要的啟動參數:(1)--dhcp-hostsfile:存放 DHCP host 信息的文件,dnsmasq 從該文件獲取 host 的 IP 與 MAC 的對應關系。 /opt/stack/data/neutron/dhcp/xxx(對應某個netwrok)/host下記錄着DHCP、所有VM的Interface信息;(2)--interface:指定提供 DHCP 服務的 interface。dnsmasq 會在該 interface 上監聽 instance 的 DHCP 請求;
2.5.6 Linux Network NameSpace
每個 namespace 都有自己獨立的網絡棧,包括 route table,firewall rule,network interface device 等。Neutron 通過 namespace 為每個 network 提供獨立的 DHCP 和路由服務,從而允許租戶創建重疊的網絡。如果沒有 namespace,網絡就不能重疊,這樣就失去了很多靈活性。
每個 dnsmasq 進程都位於獨立的 namespace, 命名為 qdhcp-(每個dnsmasq進程又對應一個network)。ip netns list 命令可以列出所有的namespace。主機本身也有一個 namespace,叫 root namespace,擁有所有物理和虛擬 interface device。物理 interface 只能位於 root namespace。
veth pair:解決了dhcp的interface(tap設備)無法直接與 root namespace 中的 bridge 設備連接。dhcp的ns設備與tap設備被稱為一對veth pair,用來將dhcp的namespace連接到root namespace 中的 bridge 設備,可以通過 ip netns exec 管理 namespace。連接關系如下圖所示:
一台VM實例創建並啟動dhcp獲取到ip的過程如下:
- 在dashboard上創建VM時,neutron會給VM分配一個port,該port包含ip/mac信息,這些信息會自動同步到dnsmasq的host文件,同時compute節點會給創建的VM分配該port對應的mac地址;
- VM開機啟動,發出 DHCP DISCOVER 廣播,該廣播消息在整個對應的network中(subnet的tap設備)都可以被收到;
- dhcp廣播報文到達DHCP的tap設備,然后傳送給veth pair另一端ns設備。dnsmasq在ns設備上面進行偵聽,dnsmasq收到其dhcp discover於是對比自己的host文件發現有對應項(應該是通過mac對比),從而將對應的ip地址、掩碼、地址租期信息返回給VM
- VM發送 DHCPREQUEST 消息確認接受此 DHCPOFFER;
- dnsmasq 發送確認消息 DHCPACK,整個過程結束;
2.5.7 VLAN網絡
vlan網絡是待tag的網絡類型,在實際應用中有較多使用。由於vlan數量有限制(4096),因此不能無限創建vlan。VM通過tap設備連接到對應的網橋上,網橋另一端連接網卡的子接口,數據流量到網卡子接口會被打上vlan tag並傳送給網卡主接口,從而實現宿主機上vlan的網絡隔離。(一個宿主機網卡可以有多個網卡子接口)
執行vi /etc/neutron/plugins/ml2/ml2_conf.ini配置文件,在ML2中將網絡類型修改為vlan,定義標簽default,指定普通用戶創建網絡的vlan范圍(admin用戶可以使用任意自己指定的vlan),並將標簽與物理網卡對應起來。修改如下:(配置完成后重啟neutron服務生效)
[ml2]
type_drivers = vlan
tenant_network_types = vlan
......
[ml2_type_vlan]
network_vlan_ranges = default:1:4094
例如:創建2個vlan網絡,同一個vlan內的vm可以相互通信,不同vlan內的vm是不能互相通信,若要使跨vlan通信就必須進行三層互通,這就涉及到Routing功能。對於相同網絡vlan網絡其在控制節點和計算節點的網橋名稱都是一樣的,可以從下圖看出:
2.5.8 Routing
Neutron 的路由服務是由 l3 agent 提供的。 除此之外,l3_agent 通過 iptables 提供 firewall 和 floating ip 服務。
配置文件為 /etc/neutron/l3_agent.ini,如果 mechanism driver 是 linux bridge,則需要將interface_driver改為BridgeInterfaceDriver;若mechanism driver是OVS,則需要將interface_driver改為OVSInterfaceDriver。l3_agent運行在控制節點或者網絡節點上。
當創建完成一個vrouter后,底層網橋會給vrouter的接口分配一個tap設備,TAP設備上不配置ip地址,l3 agent 會為每個 router 創建了一個 namespace(router 對應的 namespace 命名為 qrouter-。),通過 veth pair 與 TAP 相連,然后將 Gateway IP 配置在位於 namespace 里面的 veth interface 上,從而實現三層網絡通信。網絡架構如下圖所示。
- 可以通過ip netns 查看 namespace;
- ip netns exec
ip a查看namespace的veth interface地址配置;
講到這里,需要思考一個問題?為什么vrouter不直接在tap設備上配置網關地址,而是要在namespace的veth接口上配置?-----答案是:在vrouter多做一層namespace可以起到各個租戶之間的網絡重疊的作用(每個namespace單獨一張路由表),而直接在tap設備上配置IP相當於在root的namespace上添加subnet網段的路由(宿主機操作系統上加路由,查的是宿主機的全局路由表),這樣的路由時沒辦法工作的。這個功能在某些特定場合下很重要。
既然已經通過vrouter實現了跨vlan網絡的vm通信,那么如果實現vlan網絡與外部網絡通信呢?這里的外部網絡是指的租戶網絡以外的網絡。租戶網絡是由 Neutron 創建和維護的網絡。外部網絡不由 Neutron 創建,是已經存在的物理網絡,一般都是flat型或者vlan型。
/etc/neutron/plugins/ml2/ml2_conf.ini 配置如下:
若是flat類型網絡,需要如下配置:
若是vlan類型網絡,則進行如下配置:
在dashboard頁面上創建完外部網絡並關聯vrouter后,會對應創建外部網絡的網橋和tap設備,同時也會在vrouter對應的namespace中創建對應於tap設備的veth設備。vrouter 的每個 interface 在 namespace 中都有對應的 veth。如果 veth 用於連接租戶網絡,命名格式為 qr-xxx,比如 qr-d568ba1a-74 和 qr-e17162c5-00。如果 veth 用於連接外部網絡,命名格式為 qg-xxx,比如 qg-b8b32a88-03。整體網絡架構如下:
當數據包從 router 連接外網的接口 qg-xxx發出的時候,會做一次 Source NAT,即將包的源地址修改為 router 的外網接口地址,這樣就能夠保證目的端能夠將應答的包發回給 router,然后再轉發回源端 instance。可以通過iptables命令查看SNAT的相關規則:
ip netns exec 對應router的namespace iptables -t nat -S
SNAT主要是作為內部VM訪問外部網絡使用,單外部網絡無法直接訪問內部VM,此時就需要浮動ip來進行DNAT的轉換。
浮動ip必須要知道的幾件事:
- floating IP 提供靜態 NAT 功能,建立外網 IP 與 instance 租戶網絡 IP 的一對一映射;
- floating IP 是配置在 router 提供網關的外網 interface 上的,而非 instance 中;
- router 會根據通信的方向修改數據包的源或者目的地址(這句話意思是對於內訪外,則修改數據包源地址為float ip;對於外訪內,則修改數據包的目的ip為真實VM的ip);
2.5.9 VXLAN網絡
前期講了flat 網絡、vlan網絡、local網絡,還剩下VXLAN網絡和GRE網絡,這兩種都是Overlay網絡。overlay network 是指建立在其他網絡上的網絡。overlay network 中的節點可以看作通過虛擬(或邏輯)鏈路連接起來的,不需要關心底層的物理鏈路。vxlan網絡相對於vlan有很強的靈活性和擴展性,主要提現在以下幾個方面:
- 支持更多的二層網段。vlan的使用12 bit標記vlan ID,最多支持4094個VLAN;Vxlan則用24bit標記vlan ID,最多能支持到 16777216二層網段;
- 能更好的利用現有網絡途徑。vlan網絡通過STP進行防環,一半路徑被block;VXLAN則直接用MAC in UDP進行封裝,利用三層網絡進行轉發;
- 避免物理交換機 MAC 表耗盡。由於采用隧道機制,TOR (Top on Rack) 交換機無需在 MAC 表中記錄虛擬機的信息。(現在交換機的MAC規格都很大,不是啥問題)
vxlan報文封裝格式如下:
VXLAN Tunnel Endpoint(VTEP)
VXLAN 使用 VXLAN tunnel endpoint (VTEP) 設備處理 VXLAN 的封裝和解封。每個 VTEP 有一個 IP interface,配置了一個 IP 地址。VTEP 使用該 IP 封裝 Layer 2 frame,並通過該 IP interface 傳輸和接收封裝后的 VXLAN 數據包。VTEP既可以是軟件設備(OpenvSwitch)也可以是硬件交換機,VTEP之間建立VXLAN隧道。VXLAN 獨立於底層的網絡拓撲;反過來,兩個 VTEP 之間的底層 IP 網絡也獨立於 VXLAN。可以用一張圖描述數據包在vxlan網絡中的傳輸過程(具體細節就不再闡述,很簡單,可以在單獨去研究一下vxlan網絡架構):
目前比較成熟的 VTEP 軟件實現包括:1. 帶 VXLAN 內核模塊的 Linux;2. Open vSwitch。第一種方式如下,第二種方式待后續講解openvSwitch時詳細說明。
- Linux vxlan 創建一個 UDP Socket,默認在 8472 端口監聽。
- Linux vxlan 在 UDP socket 上接收到 vxlan 包后,解包,然后根據其中的 vxlan ID 將它轉給某個 vxlan interface,然后再通過它所連接的 linux bridge 轉給虛機。
- Linux vxlan 在收到虛機發來的數據包后,將其封裝為多播 UDP 包(同一個vxlan的都會收到),從網卡發出
vxlan網絡的配置
需要在 /etc/neutron/plugins/ml2/ml2_conf.ini 設置 vxlan network 相關參數:
[ml2]
type_drivers = vlan,vxlan
tenant_network_types = vxlan
mechanism_drivers = linuxbridge,l2population
extension_drivers = port_security
[ml2_type_vxlan]
vni_ranges = 1:10000
還需要在ml2_conf.ini中設置vtep:
控制節點/網絡節點:
計算節點上同樣設置,local_ip即為VTEP的ip地址。注意:作為准備工作,這兩個 VTEP IP 需要提前配置到節點的 eth1 上,Neutron 並不會幫我們分配這個 IP。並且,值得注意的是,vxlan網絡配置中不會特意配置vxlan標簽與網卡的對應關系,它是通過VTEP IP來找到要從哪塊網卡出去的。
此時通過 brctl show可以知道底層網絡的架構,相比於vlan網絡而言,沒有eth1.100這種子接口的概念,而是直接用vxlan interface來表示(linuxbridge、vxlan-100、eth1網卡可以對應起來,還會針對這個子網創建了一個DHCP的tap設備,也是連接該linuxbridge),可以ip -d link show dev vxlan-100(創建的vxlan網絡名)查看vxlan interface的詳細配置。架構如下圖:
同一個vxlan內,同一個節點上,VM之前通過linuxbridge就可以直接通信,若是跨節點間,則是通過宿主機間vxlan隧道到達另一主機。
以上vxlan網絡只是針對同一個二層網絡內進行通信,對於跨vxlan以及vxlan網絡到外部網絡的通信也是需要依靠vrouter與浮動ip來實現,原理和vlan網絡是類似的,此處不再繼續闡述。
2.5.10 L2 Population
vxlan組網得環境就是一個大二層網絡,如果避免在這種大二層網絡中的廣播報文占用帶寬,就需要L2 Population來解決這個問題。L2 Population 是用來提高 VXLAN 網絡 Scalability (可以理解為高效運轉)。
如下圖,VM A要想去訪問其他HOST上的同vxlan的節點時會發送arp廣播報文,這樣整個網絡環境里會存在大量的arp廣播報文,從而占用網絡帶寬。此時L2 Population的出現解決了這個問題。
L2 Population可以讓HOST開啟一個ARP Proxcy的功能,本地的arp廣播報文則由本地HOST主機直接響應其arp請求,並使得VTEP能夠預先獲知 VXLAN 網絡的相關信息:(1)VM的IP/MAC信息;(2)VM--VTEP的對應關系。如下圖:
那么此時另一個問題又來了,VTEP 是如何提前獲知 IP -- MAC -- VTEP 相關信息的呢?答案如下:
- Neutron 知道每一個 port 的狀態和信息; port 保存了 IP,MAC 相關數據。
- instance 啟動時,其 port 狀態變化過程為:down -> build -> active。
- 每當 port 狀態發生變化時,Neutron 都會通過 RPC 消息通知各節點上的 Neutron agent,使得 VTEP 能夠更新 VM 和 port 的相關信息。
從而每個VTEP都知道了其他(VTEP)HOST上都有哪些VM,這樣就大大減少了網絡中arp廣播報文的帶寬占用。
L2 Population的配置參見vxlan中的相關部分。需要在 /etc/neutron/plugins/ml2/ml2_conf.ini 設置 mechanism_drivers = linuxbridge,l2population,l2_population = Ture;
可以通過bridge fdb show dev vxlan-100(vxlan名稱)查看節點上的 forwarding database(保存的其他VTEP的地址以及其他VM的MAC);
2.5.11 Security Group
Neutron 為 instance 提供了兩種管理網絡安全的方法:安全組(Security Group)和虛擬防火牆。安全組的原理是通過 iptables 對 instance 所在計算節點的網絡流量進行過濾。虛擬防火牆則由 Neutron Firewall as a Service(FWaaS)高級服務提供。其底層也是使用 iptables,在 Neutron Router 上對網絡包進行過濾。
“default” 安全組有四條規則,其作用是:允許所有外出(Egress)的流量,但禁止所有進入(Ingress)的流量。創建VM時如果沒有選擇其他安全組,則默認強制使用default安全組。安全組功能可理解就是白名單的服務。具體可以在節點上iptables-save 命令查看相關規則,iptables 的規則是應用在 Neutron port 上的,也就是VM的虛擬網卡TAP設備上。
總結下來,安全組特性如下:
- 通過宿主機上 iptables 規則控制進出 instance 的流量。
- 安全組作用在 instance 的 port 上。
- 安全組的規則都是 allow,不能定義 deny 的規則。
- instance 可應用多個安全組疊加使用這些安全組中的規則。
2.5.12 Neutron FWaaS
Firewall as a Service(FWaaS)是 Neutron 的一個高級服務。用戶可以用它來創建和管理防火牆,在 subnet 邊界上對 layer 3 和 layer 4 的流量進行過濾。FWaaS 有三個重要概念:Firewall、Policy 和 Rule。
- Firewall:租戶能夠創建和管理的邏輯防火牆資源。Firewall 必須關聯某個 Policy,因此必須先創建 Policy。
- Firewall Policy:Policy 是 Rule 的集合,Firewall 會按順序應用 Policy 中的每一條 Rule。
- Firewall Rule:Rule 是訪問控制規則,由源與目的子網 IP、源與目的端口、協議、allow 或 deny 動作組成。
防火牆與安全組的區別。可以理解為防火牆的最小作用單元是subnet級別的防護,而安全組則是針對instance的防護。 /etc/neutron/fwaas_driver.ini 文件中設置 FWaaS 使用的 driver:(新版防火牆沒有這個driver配置)
還需要在 /etc/neutron/neutron.conf 中啟用 FWaaS plugin:
具體可以通過 ip netns <namespace名稱> iptables-save查看對應router的防火牆規則狀態。最后,FWaaS 用於加強 Neutron 網絡的安全性,與安全組可以配合使用,防火牆與安全組的異同點總結如下:
相同點:
-
- 底層都是通過 iptables 實現
不同點:
-
- FWaaS 的 iptables 規則應用在 router 上,保護整個租戶網絡;安全組則應用在虛擬網卡上,保護單個 instance。
-
- FWaaS 可以定義 allow 或者 deny 規則;安全組只能定義 allow 規則。
2.5.13 Neutorn LBaaS
LBaaS 有三個主要的概念: Pool Member,Pool 和 Virtual IP。
- Pool Member:Pool Member 是 layer 4 的實體,擁有 IP 地址並通過監聽端口對外提供服務。
- Pool:Pool 由一組 Pool Member 組成。
- Virtual IP:Virtual IP 也稱作 VIP,是定義在 load balancer 上的 IP 地址
OpenStack Neutron 目前默認通過 HAProxy 軟件來實現 LBaaS。 HAProxy 是一個流行的開源 load balancer。 Neutron 也支持其他一些第三方 load balancer。實現方式如下圖所示:
配置LB:(最新版本的配置可能與下面有差異,按官網最新版本安裝步驟來)
/etc/neutron/services/loadbalancer/haproxy/lbaas_agent.ini。定義 interface_driver:
interface_driver 的作用是設置 load balancer 的網絡接口驅動,可以有兩個選項:
Linux Bridge
interface_driver = neutron.agent.linux.interface.BridgeInterfaceDriver
Open vSwitch
interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
/etc/neutron/neutron.conf 中設置啟用 LBaaS plugin:
在 /etc/neutron/neutron_lbaas.conf 中設置 service provider:
除了默認的 HAProxy,Neutron 也支持第三方 provider,比如 radware,VMWareEdge 等等。
LB的幾種負載分擔算法:
- ROUND_ROUBIN:如果采用 round robin 算法,load balancer 按固定的順序從 pool 中選擇 member 相應 client 的連接請求。這種方法的不足是缺乏機制檢查 member 是否負載過重。有可能出現某些 member 由於處理能力弱而不得不繼續處理新連接的情況。
- LEAST_CONNECTIONS:如果采用 least connections 算法,load balancer 會挑選當前連接數最少的 pool member。這是一種動態的算法,需要實時監控每個 member 的連接數量和狀態。
- SOURCE_IP:如果采用 source IP 算法,具有相同 sourSession Persistencece IP 的連接會被分發到同一個 pool member。source IP 算法對於像購物車這種需要保存狀態的應用特別有用;
Session Persistence(會話保持):
- SOURCE_IP:這種方式與前面 load balance 的 SOURCE_IP 效果一樣。初始連接建立后,后續來自相同 source IP 的 client 請求會發送給同一個 member;
- HTTP_COOKIE:當 client 第一次連接到 VIP 時,HAProxy 從 pool 中挑選出一個 member。當此 member 響應請求時,HAProxy 會在應答報文中注入命名為 “SRV” 的 cookie,這個 cookie 包含了該 member 的唯一標識。client 的后續請求都會包含這個 “SRV” cookie。HAProxy 會分析 cookie 的內容,並將請求轉發給同一個 member。HTTP_COOKIE 優於 SOURCE_IP,因為它不依賴 client 的 IP。
- APP_COOKIE:app cookie 依賴於服務器端應用定義的 cookie。比如 app 可以通過在 session 中創建 cookie 來區分不同的 client。HAProxy 會查看報文中的 app cookie,確保將包含 app cookie 的請求發送到同一個 member。
Key Pairs
對於一些登陸密碼隨機的image,可以使用key pairs的功能來進行免密登陸。 通過ssh-keygen -t rsa -f xx.key生成 Key Pair,會生成兩個文件一個是xx.key。另一個是xx.key.pub。其中 cloud.key.pub 是公鑰,需要添加到 instance 的 ~/.ssh/authorized_keys 文件中。 cloud.key 是私鑰,用於訪問 instance。將公鑰cloud.key.pub的內容復制到openstack導入界面中即可,完成導入。然后就可以通過ssh -i指定私鑰進行登陸VM了。
健康檢查
需要注意,在LB中配置健康檢查的目的是周期性探測WEB Server的活動狀態,防止server掛了業務流還持續往故障機器發送;
Neutron中LB的底層實現原理
對於每創建一個pool地址池,Neutron 都會創建新的 namespace qlbaas-xxx,該 namespace 對應我們創建的 pool “web servers”。其命名格式為 qlbaas-< pool ID>。對於每一個 pool,Neutron 都會啟動一個 haproxy 進程提供 load balancering 功能。也就是說:一個pool地址池-----namespace-----一個haprocxy進程。haproxy 配置文件保存在 /opt/stack/data/neutron/lbaas/< pool ID>/conf 中。
總結一下:(1)LBaaS 為租戶提供了橫向擴展應用的能力,租戶之間是隔離的。(2)租戶可以將外部請求 balancing 到多個 instance 上,並通過 monitor 實現應用的高可用。
至此linux-bridge部分實現neutron網絡暫告一段落,后續具體細節部分再針對性的講解!
2.6 Open vSwitch
2.6.1 Open vSwitch配置
相對linux-bridge,首先需要安裝openstack-neutron-openvswitch。然后對應將ML2 的配置文件 /etc/neutron/plugins/ml2/ml2_conf.ini中的mechanism driver設置為openvswitch。組網方式其實與linux-bridge相差無幾,可以通過 neutron agent-list 命令查看到 neutron-openvswitch-agent在節點上的運行情況。
2.6.2 OVS中的網絡設備類型
Neutron默認在網絡節點(此處網絡節點與控制節點合一)上創建三個網橋:br-ex,br-int 和 br-tun。計算節點上也有 br-int 和 br-tun(沒有br-ex網橋)。
- br-ex:連接外部(external)網絡的網橋。
- br-int:集成(integration)網橋,所有 instance 的虛擬網卡和其他虛擬網絡設備都將連接到該網橋。
- br-tun:隧道(tunnel)網橋,基於隧道技術的 VxLAN 和 GRE 網絡將使用該網橋進行通信。
這些網橋需要用 Open vSwitch 的命令 ovs-vsctl show進行查看,如下所示:
在 Open vSwitch 環境中,一個數據包從 instance 發送到物理網卡大致會經過下面幾個類型的設備:
1、tap interface:命名為 tapXXXX;2、linux bridge:命名為qbrXXXX;3、veth pair:命名為 qvbXXXX, qvoXXXX;4、OVS integration bridge:命名為 br-int;5、OVS patch ports:命名為 int-br-ethX 和 phy-br-ethX(X 為 interface 的序號);6、OVS provider bridge:命名為 br-ethX(X 為 interface 的序號);7、物理 interface:命名為 ethX(X 為 interface 的序號);8、OVS tunnel bridge:命名為 br-tun。
其中,OVS provider bridge 會在 flat 和 vlan 網絡中使用;OVS tunnel bridge 則會在 vxlan 和 gre 網絡中使用;
2.6.3 Local Network
對於一個local類型的網絡,其DHCP的TAP設備是直接關聯到br-int網橋的,通過veth連接到dhcp的namesapce,在namespace里查看網卡名稱也是tapXX的描述。這點在linux-bridge既有相同之處,也有不同之處,兩者的實現方式還是不同的。區別在於,對於linux-bridge實現方式,一端連接的tap設備,另一端是連接的對應namespace的ns設備。
值得注意的是,brctl show主要是對於linux-bridge環境下查看網橋的配置信息,對於Open vSwitch則是用ovs-vsctl show 查看 bridge 的配置。當新建一個VM實例時,通過ovs-vsctl show查看網橋下br-int下增加一個qvoxxx類型的設備,而通過brctl show查看會發現新建了一個qbrxx網橋,關聯tapxx設備與qvb設備。其中qvb設備與qvo設備之間組成了一對veth pair(可以通過ethtool -S查看設備veth pair的對應索引關系statistics),相當於實例VM首先與新建的qbrxx網橋上的tapxx設備互聯,qbrxx再通過veth pair與br-int網橋互聯,總體結構如下圖。從而,VM實例的tapxx設備(虛擬網卡)則間接連接到了br-int網橋。這點相對之前linux-bridge實現方式----直接通過tap設備與新建的網橋關聯,結構上要相對復雜。
增加qbrxx這個網橋的原因主要是: Open vSwitch 目前還不支持將 iptables 規則放在與它直接相連的 tap 設備上。如果做不到這一點,就無法實現 Security Group 功能。對於不同的local network網絡,所有的VM實例間接都連接到同一個br-int網橋,Open vSwitch是怎么進行不同local網絡的隔離呢?-----答案就是:通過vlan進行隔離。先看下面一張圖:
其中qvo設備可以看成不同實例VM連接網橋br-int的接口,tap設備為不同local 網絡的dhcp設備,tag其實就是vlan tag(與物理交換機上的vlan無關,虛擬交換機的vlan區分),不同local網絡的VM之間的隔離就是靠tag進行區分和隔離。結構如下:
2.6.4 Flat Network
由Open vSwitch實現的Flat網絡與linux-bridge的實現方式很類似,都是每個flat網絡都會占用一塊物理網卡,linux-bridge中直接是通過flat物理標簽與宿主機物理網卡一一對應,而Open vSwitch中則是通過網絡標簽與創建的網橋進行對應,網橋與宿主機的物理網卡進行一一對應。基本配置與linux-bridge類似,如下:
修改租戶網絡類型:
設置網絡標簽:
設置ovs mapping中標簽與網橋對應關系,注意此處對應的網橋是后續需要創建的
網橋創建命令:ovs-ovctl,ovs-ovctl add-br [網橋名稱] 表示創建網橋,ovs-ovctl add-port [網橋名稱] [網卡]。當創建多個標簽時,之間用逗號隔開,同時在映射關系上也對應多個網橋,每個網橋對應不同網卡。ovs-vsctl show可以看到:
對於 ovs bridge “br-eth1” 和其上橋接的 port “eth1” 我們應該不會感到意外,這是前面配置的結果。然而除此之外,br-int 和 br-eth1 分別多了一個 port “int-br-eth1” 和 “phy-br-eth1”,而且這兩個 port 都是 “patch” 類型,同時通過 “peer” 指向對方。這表明:br-int 與 br-eth1 這兩個網橋通過 int-br-eth1 和 phy-br-eth1 連接在一起了。其網絡結構如下圖所示:
這里可以看到網橋br-int 與 br-eth1之間是通過patch port 連接在一起,而不是veth pair。總的看來,patch port 是 ovs bridge 自己特有的 port 類型,只能在 ovs 中使用。如果是連接兩個 ovs bridge,優先使用 patch port,因為性能更好。對於ovs網橋之間可以使用patch port,性能更好,除外其他情況一般只能使用veth pair進行網橋連接。
通過對比flat網絡類型與local網絡類型可以發現,flat網絡類型相對而言只是多了一個自己創建的網橋(對應某塊物理網卡),DHCP的TAP設備都是掛在br-int這個默認集成網橋上,OVS網橋通過patch port與br-int網橋進行連接,br-int網橋再通過veth pair與關聯實例tap設備的qbr網橋連接。從而完成了VM實例間接連接到了br-xxx網橋(創建的對應物理網卡的網橋)。其網絡結構圖如下所示:
2.6.5 Vlan Network
在 Open vSwitch 實現方式下,不同 vlan instance 的虛擬網卡都接到 br-int (集成網橋)上。這一點與 linux bridge 非常不同,linux bridge 是不同 vlan (類似網卡子接口如eth1.100等)接到不同的網橋上。配置方式上,Open vSwitch方式是對應網橋(如下),而linux-bridge是對應物理網卡,另外OVS還需要通過ovs-ovctl創建網橋,並在網橋關聯相應網卡。其他配置基本都一樣,就不再展開說了。
通過創建網絡、實例VM,通過ovs-ovctl查看可以發現這種網絡其實和local網絡也比較類似,創建的DHCP的TAP設備與VM的port都帶有tag,每創建一個VM都會對應創建一個linux-bridge網橋,VM通過網橋間的veth-pair間接連接到br-int。這點很相似。
網絡結構如下:
針對不同的vlan網絡,vlan網絡之間是怎么進行隔離的呢?其實實現原理主要是通過Open vSwitch的flow rule(流規則)進行控制。不同vlan網絡的網絡架構如下圖所示:
相對於Linux Bridge driver用eth1.xx的vlan接口實現vlan網絡隔離。open vswitch則是用flow rule來對進出br-int的集成網橋、br-ethxx網橋等進行流量控制,可以對相應進出端口的流量進行加vlan標簽、修改vlan標簽、剝vlan標簽,從而完成vlan網絡的隔離。查看 flow rule 的命令是 ovs-ofctl dump-flow ,首先查看計算節點 br-eth1 的 flow rule:
可以看到,每條 rule 有不少屬性,其中比較重要的屬性有:
- priority:rule 的優先級,值越大優先級越高。Open vSwitch 會按照優先級從高到低應用規則;
- in_port:inbound 端口編號,每個 port 在 Open vSwitch 中會有一個內部的編號。可以通過命令 ovs-ofctl show
查看 port 編號。比如 br-eth1:
- dl_vlan:數據包原始的 VLAN ID;
- actions:對數據包進行的操作;
首先分析一下br-eth1的flow rule的關鍵信息,ovs-ofctl show br-eth1查看:
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)接收進來的包(其實就是VM的數量包由br-int的int-br-eth1端口發送給的phy-br-eth1端口的包),如果 VLAN ID 是 1(dl_vlan=1),那么需要將 VLAN ID 改為 100(actions=mod_vlan_vid:100)
怎么理解將 VLAN ID 1 改為 VLAN ID 100 呢?
通過ovs-vsctl show命令查看節點的open vswitch網橋配置:
可以看到,br-int網橋下不同的port的帶有不同的tag標簽,這個tag可以看作是節點內部的vlan標簽,通過這種內部的vlan標簽來隔離port,內部的vlan tag對應不同的vlan網絡,該對應關系由neutron進行維護,並將轉換規則配置在 flow rule 中。該內部vlan tag只在br-int有效,與外部網絡的vlan無關,不同於物理網絡的vlan。總的來看,進入br-ethxx網橋phy-br-ethxx端口的報文,flow rule是將原來的內部vlan轉換成對應配置的vlan tag;而進入br-int網橋的int-br-ethxx則是將物理vlan替換回int-br的內部vlan。從而完成了vlan網絡的隔離。
2.6.6 Routing
Routing主要是由L3 agent提供服務,L3 agent需要正確配置才能工作,配置文件為 /etc/neutron/l3_agent.ini。大部分情況下默認配置已經幫我們配置好了,不需要再單獨配置。需要注意:
如果 mechanism driver 是 open vswitch,則:
interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
如果選用 linux bridge,則:
interface_driver = neutron.agent.linux.interface.BridgeInterfaceDriver
L3 agent運行在網絡節點或者控制節點(如果網絡節點與控制節點合一,如果是分布式則運行在計算節點)
對於routing的底層實現,可以進一步分析來看。創建兩個vlan網絡vlan 100、vlan 101。底層上在br-int對應增加了兩個port(分別對應兩個vlan)。與 linux bridge 實現方式一樣, router_100_101 運行在自己的 namespace 中。與linux-bridge不同的地方在於,router的qrxx端口在ovs中是直接作為br-int網橋上的Port存在的,沒有linux-bridge的veth pair線路將qrxxx設備與網橋上的tap設備互聯。此外,可以看到br-int網橋上的router的port也是帶tag的,對應vlan在br-int網橋上的內部vlan。
整體的網絡結構參加下圖:
以上講解了neutron網絡內跨vlan網絡的互訪情況,那么對於外部外部網絡的訪問,是如何實現呢?首先 需要設置外部網絡的標簽,例如標簽label命名為 “external”,網橋為 br-ex。
如果類型為 flat,控制節點 /etc/neutron/plugins/ml2/ml2_conf.ini 配置如下:
如果類型為 vlan,配置如下:
此外,我們還需要在節點上通過ovs-vsctl add-br br-ex命令創建網橋,然后由ovs-vsctl add-port br-ex xxx命令將xxx網卡關聯到br-ex網橋。總的來說,當外部網絡為flat網絡時,每個flat網絡對應一塊物理網卡,如果有多個外部網絡則需要多塊物理網卡與之對應;當外部網絡為vlan網絡時,多個不同vlan的flat網絡可以對應一塊網卡。創建完成外部網絡,可以查看到底層網橋上br-int與br-ex之間通過int-br-ex與phy-br-ex的patch port連接起來。
創建完成外部網絡的子網后,neutron會自動在br-ex網橋上分配一個port(qgxxx)。router interface 的命名規則如下: 1. 如果 interface 用於連接租戶網絡,命名格式為 qr-xxx(關聯br-int網橋);2. 如果 interface 用於連接外部網絡,命名格式為 qg-xxx(關聯br-ex網橋)。br-int與br-ex之間也是由一對patch port連接起來,主要用來承載VM進出外部網絡的流量。網絡架構整體描述如下:
通過圖上可以看出,一台VM想要訪問外部網絡,經過的路徑為:qvbxxx(接口,存在vm自身tap設備關聯的網橋上qbrxxx)→qvoxxx(接口,br-int網橋上)→qrxx接口(router接口)→int-br-ex(br-int網橋上)→phy-br-ex(br-ex網橋上)→qgxxx(br-ex網橋)→外部網絡。qrxx與qgxx接口之間並不是直接通過router過來的,而是需要通過int-br-ex與phy-br-ex這對patch port間通過。其出網過程中,與linux-bridge實現方式一樣,會進行SNAT轉換,入網則用float ip模式進行DNAT轉換。
2.6.7 Vxlan Network
配置准備:在/etc/neutron/plugins/ml2/ml2_conf.ini配置文件中使能vxlan、l2population,指定租戶vxlan網絡的配置范圍。
設置租戶創建網絡類型為vxlan:
設置vxlan的范圍:
設置agent的類型為vxlan。使能l2_population(目的是減少vxlan內隧道里的arp泛洪報文)
ovs中配置local_ip地址和對應網橋,沒有指定網卡對應關系,通過對應的ip查找路由選擇對應從哪塊網卡出去(這點與linux-bridge的方法比較類似):
其網絡架構的網橋橋接模式與vlan網絡比較類似,br-int網橋與br-tun網橋之間通過patch port互聯(patch-tun~patch int)(如下):
通過比較其底層的網絡結構,與vlan網絡大部分都比較類似,相對而言vxlan網絡在br-tun網橋下會多創建一個port vxlanxxx(上面記錄了本端與對端的VTEP IP),用來在控制節點與計算節點之間建立vxlan隧道。控制節點上:
計算節點上:
其網絡結構如下所示:
隧道建立起來了,VM之間的數據流量在整個過程是怎么轉發呢?------這主要是依靠flow rule來指導進行轉發,該部分也是很復雜的一部分內容,按照之前的例子分別查看br-int、br-tun的流表。
br-int的flow rule:
br-int 的 rule 看上去雖然多,其實邏輯很簡單,br-int 被當作一個二層交換機,其重要的 rule 是下面這條:
cookie=0xaaa0e760a7848ec3, duration=52798.625s, table=0, n_packets=143, n_bytes=14594, idle_age=9415, priority=0 actions=NORMAL
此規則的含義是:根據 vlan 和 mac 進行轉發。
br-tun 的 flow rule:(主要)
這些才是真正處理 VXLAN 數據包的 rule,其流程如下:
上圖各方塊中的數字對應 rule 中 table 的序號,下面分析各個table的功能與作用。
table 0:
cookie=0xaaa0e760a7848ec3, duration=76707.867s, table=0, n_packets=70, n_bytes=6600, idle_age=33324, hard_age=65534, priority=1,in_port=1 actions=resubmit(,2)
cookie=0xaaa0e760a7848ec3, duration=76543.287s, table=0, n_packets=56, n_bytes=4948, idle_age=33324, hard_age=65534, priority=1,in_port=2 actions=resubmit(,4)
cookie=0xaaa0e760a7848ec3, duration=76707.867s, table=0, n_packets=0, n_bytes=0, idle_age=65534, hard_age=65534, priority=0 actions=drop
結合如下port編號:
table 0 flow rule 的含義為:(即第一條 rule 處理來自內部 br-int(這上面掛載着所有的網絡服務,包括路由、DHCP 等)的數據;第二條 rule 處理來自外部 VXLAN 隧道的數據。)
- 從 port 1(patch-int)進來的包,扔給 table 2 處理:actions=resubmit(,2)
- 從 port 2(vxlan-a642100b)進來的包,扔給 table 4 處理:actions=resubmit(,4)
table 4:
cookie=0xaaa0e760a7848ec3, duration=76647.039s, table=4, n_packets=56, n_bytes=4948, idle_age=33324, hard_age=65534, priority=1,tun_id=0x64 actions=mod_vlan_vid:1,resubmit(,10)
table 4 flow rule 的含義為: 如果數據包的 VXLAN tunnel ID 為 100(tun_id=0x64),action 是添加內部 VLAN ID 1(tag=1),然后扔給 table 10 去學習。
table 10:
cookie=0xaaa0e760a7848ec3, duration=76707.865s, table=10, n_packets=56, n_bytes=4948, idle_age=33324, hard_age=65534, priority=1 actions=learn(table=20,hard_timeout=300,priority=1,cookie=0xaaa0e760a7848ec3,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
table 10 flow rule 的含義為: 學習外部(從 tunnel)進來的包,往 table 20 中添加對返程包的正常轉發規則,然后從 port 1(patch-int)扔給 br-int。
rule 中下面的內容為學習規則,這里就不詳細討論了。
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[]
table 2:
cookie=0xaaa0e760a7848ec3, duration=76707.866s, table=2, n_packets=28, n_bytes=3180, idle_age=33324, hard_age=65534, priority=0,dl_dst=00:00:00:00:00:00/01:00:00:00:00:00 actions=resubmit(,20)
cookie=0xaaa0e760a7848ec3, duration=76707.866s, table=2, n_packets=42, n_bytes=3420, idle_age=33379, hard_age=65534, priority=0,dl_dst=01:00:00:00:00:00/01:00:00:00:00:00 actions=resubmit(,22)
table 2 flow rule 的含義為:
- br-int 發過來數據如果是單播包,扔給 table 20 處理:resubmit(,20)
- br-int 發過來數據如果是多播或廣播包,扔 table 22 處理:resubmit(,22)
table 20:
cookie=0xaaa0e760a7848ec3, duration=76543.287s, table=20, n_packets=28, n_bytes=3180, idle_age=33324, hard_age=65534, priority=2,dl_vlan=1,dl_dst=fa:16:3e:fd:8a:ed actions=strip_vlan,set_tunnel:0x64,output:2
cookie=0xaaa0e760a7848ec3, duration=76707.865s, table=20, n_packets=0, n_bytes=0, idle_age=65534, hard_age=65534, priority=0 actions=resubmit(,22)
table 20 flow rule 的含義為:
- 第一條規則就是 table 10 學習來的結果。內部 VLAN 號為 1(tag=1),目標 MAC 是 fa:16:3e:fd:8a:ed(virros-vm2)的數據包,即發送給 virros-vm2 的包,action 是去掉 VLAN 號,添加 VXLAN tunnel ID 100(十六進制 0x64),並從 port 2 (tunnel 端口 vxlan-a642100b) 發出。
- 對於沒學習到規則的數據包,則扔給 table 22 處理。
table 22:
cookie=0xaaa0e760a7848ec3, duration=76543.282s, table=22, n_packets=2, n_bytes=84, idle_age=33379, hard_age=65534, dl_vlan=1 actions=strip_vlan,set_tunnel:0x64,output:2
cookie=0xaaa0e760a7848ec3, duration=76707.82s, table=22, n_packets=40, n_bytes=3336, idle_age=65534, hard_age=65534, priority=0 actions=drop
table 22 flow rule 的含義為: 如果數據包的內部 VLAN 號為 1(tag=1),action 是去掉 VLAN 號,添加 VXLAN tunnel ID 100(十六進制 0x64),並從 port 2 (tunnel 端口 vxlan-a642100b) 發出。匹配不上就丟棄。
以上簡單對流表進行了分析,可以看出是很復雜的,也是neutron學習過程中很燒腦的部分。此外,vxlan的float ip和routing和vlan網絡類似,不再講解。