Open vSwitch 入門實踐(1)簡介
OVS簡介
Open vSwitch 是什麼?
Open vSwitch(以下簡稱OVS)是一個用C語言開發的多層虛擬交換機,使用Apcahe 2開源許可證,現如今基本上已經成為了開源SDN(軟體定義網路)基礎設施層的事實標準。
OVS支援哪些 功能 ?
- 支援NetFlow、sFlow(R)、IPFIX、SPAN、RSPAN和GRE隧道映象等多種流量監控協議
- 支援LACP (IEEE 802.1AX-2008)
- 支援標準802.1Q VLAN協議,允許埠配置trunk模式
- 支援組播
- 支援BFD和802.1ag鏈路監控
- 支援STP(IEEE 802.1D-1998)和RSTP(IEEE 802.1D-2004)
- 支援細粒度的QoS(服務質量)配置
- 支援HFSC qdisc
- 支援接管每一個虛擬機器的流量
- 支援基於源MAC的負載均衡、主備模式和L4雜湊的埠綁帶
- 支援OpenFlow協議(包含了很多對虛擬化的擴充套件)
- 支援IPv6
- 支援多種隧道協議(GRE、VXLAN、STT、Geneve和IPsec)
- 支援C和Python的遠端配置協議
- 支援核心和使用者空間的轉發引擎選項
- 具有流快取引擎的多表轉發管道
- 轉發層抽象以簡化向新軟體和硬體平臺的移植
OVS的術語解釋
Bridge
中文名稱 網橋 ,一個Bridge代表一個乙太網交換機(Switch),一臺主機中可以建立一個或多個Bridge,Bridge可以根據一定的規則,把某一個埠接收到的資料報文轉發到另一個或多個埠上,也可以修改或者丟棄資料報文。
Port
中文名稱 埠 ,需要注意的是它和TCP裡面的埠不是同樣的概念,它更像是物理交換機上面的插口,可以接水晶頭的那種。Port隸屬於Bridge,必須先添加了Bridge才能在Bridge上新增Port。Port有以下幾種型別:
-
Normal
使用者可以把作業系統中已有的網絡卡新增到Open vSwicth上,Open vSwitct會自動生成一個同名的Port開處理這張網絡卡進和出的資料報文。
不過需要注意的是這種方式新增的Port不支援分配IP地址,如果之前網絡卡上配置的有IP,掛載到OVS上面之後將不可訪問。此型別的Port常用於VLAN模式的多臺物理主機相連的那個口,交換機一端屬於Trunk模式。
- Internal
當Port的型別是Internal時,OVS會自動建立一個虛擬網絡卡(Interface),此埠收到的資料報文都會轉發給這塊網絡卡,從這塊網絡卡發出的資料報文也會通過Port交給OVS處理。當OVS建立一個新的網橋時,會自動建立一個與網橋同名的Internal Port,同時也會建立一個與網橋同名的Interface,因此可以通過ip命令在作業系統中檢視到這張虛擬網絡卡,但是狀態是down的。
- Patch
Patch Port和veth pair功能相同,總是成雙成對的出現,在其中一端收到的資料報文會被轉發到另一個Patch Port上,就像是一根網線一樣。Patch Port常用於連線兩個Bridge,這樣兩個網橋就和一個網橋一樣了。
- Tunnel
OVS 支援 GRE、VXLAN、STT、Geneve和IPsec隧道協議,這些隧道協議就是overlay網路的基礎協議,通過對物理網路做的一層封裝和擴充套件,解決了二層網路數量不足的問題,最大限度的減少對底層物理網路拓撲的依賴性,同時也最大限度的增加了對網路的控制。
Interface
(iface/介面)介面是OVS與作業系統交換資料報文的元件,一個介面即是作業系統上的一塊網絡卡,這個網絡卡可能是OVS生成的虛擬網絡卡,也有可能是掛載在OVS上的物理網絡卡,作業系統上的虛擬網絡卡(TUN/TAP)也可以被掛載在OVS上。
Controller
OpenFlow控制器,OVS可以接收一個或者多個OpenFlow控制器的管理,功能主要是下發流表,控制轉發規則。
Flow
流表是OVS進行資料轉發的核心功能,定義了埠之間轉發資料報文的規則,一條流表規則主要分為匹配和動作兩部分,匹配部分決定哪些資料報文需要被處理,動作決定了匹配到的資料報文該如何處理。
OVS常用操作
安裝
yum install openvswitch systemctl enable openvswitch systemctl start openvswitch
如果當前軟體源中沒有openvswitch,可以通過 阿里雲官方映象站 下載和作業系統版本對應的rpm包到本地再安裝。 示例命令: yum localinstall openvswitch-2.9.0-3.el7.x86_64.rpm
Bridge 操作
新增網橋
ovs-vsctl add-br br-int
查詢網橋列表
ovs-vsctl list-br
刪除網橋
ovs-vsctl del-br br-int
Port 操作
- Normal Port
# 將物理網絡卡eth0新增到網橋br-int上 ovs-vsctl add-port br-int eth0 # 移除網橋br-int上的Port ovs-vsctl del-port br-int eth0
- Internal Port
# 新增Internal Port ovs-vsctl add-port br-int vnet0 -- set Interface vnet0 type=internal # 把網絡卡vnet0啟動並配置IP ip link set vnet0 up ip addr add 192.168.0.1/24 dev vnet0 # 設定VLAN tag ovs-vsctl set Port vnet0 tag=100 # 移除vnet0上面的VLAN tag配置 ovs-vsctl remove Port vnet0 tag 100 # 設定vnet0允許通過的VLAN tag ovs-vsctl set Port vnet0 trunks=100,200 # 移除vnet0允許通過的的VLAN tag配置 ovs-vsctl remove Port vnet0 trunks 100,200
- Patch Port
ovs-vsctl add-br br0 ovs-vsctl add-br br1 ovs-vsctl \ -- add-port br0 patch0 -- set interface patch0 type=patch options:peer=patch1 \ -- add-port br1 patch1 -- set interface patch1 type=patch options:peer=patch0
- Tunnel Port
#主機10.1.7.21上 ovs-vsctl add-br br-tun ovs-vsctl add-port br-tun vxlan-vx01 -- set Interface vxlan-vx01 type=vxlan options:remote_ip=10.1.7.22 options:key=flow ovs-vsctl add-port br-tun vxlan-vx02 -- set Interface vxlan-vx02 type=vxlan options:remote_ip=10.1.7.23 options:key=flow #主機10.1.7.22上 ovs-vsctl add-br br-tun ovs-vsctl add-port br-tun vxlan-vx01 -- set Interface vxlan-vx01 type=vxlan options:remote_ip=10.1.7.21 options:key=flow ovs-vsctl add-port br-tun vxlan-vx02 -- set Interface vxlan-vx02 type=vxlan options:remote_ip=10.1.7.23 options:key=flow #主機10.1.7.23上 ovs-vsctl add-br br-tun ovs-vsctl add-port br-tun vxlan-vx01 -- set Interface vxlan-vx01 type=vxlan options:remote_ip=10.1.7.21 options:key=flow ovs-vsctl add-port br-tun vxlan-vx02 -- set Interface vxlan-vx02 type=vxlan options:remote_ip=10.1.7.22 options:key=flow
- 其他基本操作
# 設定VLAN mode ovs-vsctl set port <port name> VLAN_mode=trunk|access|native-tagged|native-untagged # 設定VLAN tag ovs-vsctl set port <port name> tag=<1-4095> # 設定VLAN trunk ovs-vsctl set port <port name> trunk=100,200 # 移除Port的屬性 ovs-vsctl remove port <port name> <property name> <property value> # 檢視Port的屬性 ovs-vsctl list interface <port name>
接下來我們將使用OVS來實現單機和多臺物理伺服器下的虛擬VLAN網路。
本文首發我的微信公眾號:我在對面的角落
- 天翼雲全場景業務無縫替換至國產原生作業系統CTyunOS!
- 以羊了個羊為例,淺談小程式抓包與響應報文修改
- 這幾種常見的 JVM 調優場景,你知道嗎?
- 如此狂妄,自稱高效能佇列的Disruptor有啥來頭?
- 為什麼要學習GoF設計模式?
- 827. 最大人工島 : 簡單「並查集 列舉」運用題
- 手把手教你如何使用 Timestream 實現物聯網時序資料儲存和分析
- 850. 矩形面積 II : 掃描線模板題
- Java 併發程式設計解析 | 基於JDK原始碼解析Java領域中的併發鎖,我們可以從中學習到什麼內容?
- 【手把手】光說不練假把式,這篇全鏈路壓測實踐探索
- 大廠鍾愛的全鏈路壓測有什麼意義?四種壓測方案詳細對比分析
- 寫個續集,填坑來了!關於“Thread.sleep(0)這一行‘看似無用’的程式碼”裡面留下的坑。
- 857. 僱傭 K 名工人的最低成本 : 列舉 優先佇列(堆)運用題
- Vue3 實現一個自定義toast(小彈窗)
- 669. 修剪二叉搜尋樹 : 常規樹的遍歷與二叉樹性質
- 讀完 RocketMQ 原始碼,我學會了如何優雅的建立執行緒
- 效能調優——小小的log大大的坑
- 1582. 二進位制矩陣中的特殊位置 : 簡單模擬題
- elementui原始碼學習之仿寫一個el-switch
- 646. 最長數對鏈 : 常規貪心 DP 運用題