王飛




摘要:近年來,隨著數據中心的不斷發展,實現了數據中心計算和存儲資源的虛擬化和按需分配,但網絡虛擬化一直受各種因素的限制,SDN技術的出現,為有效整合現有數據中心網絡資源提供很好的解決方式。本文通過軟件仿真,對數據中心VXLAN的構建、openflow流表的下發機制進行實驗和驗證,實現了SDN網絡集中規劃管理、控制面和數據面分離、網絡軟件化和網絡可編程等特性,為省級數據中心網絡架構升級轉型提供實踐經驗。
如今,數據中心計算和存儲資源的虛擬化和按需分配,已基本滿足各種軟硬件資源池化和信息系統整合重構的要求,充分保障業務系統的連續性。但隨著數據中心的不斷發展壯大,網絡資源的有效整合利用一直被各種因素制約和限制,值得關注。
一、數據中心網絡資源利用存在的問題
(一)虛擬化環境下網絡配置的復雜度極大提升
隨著數據中心計算及存儲資源不斷虛擬化,形成多個虛擬網絡共享底層物理網絡資源的情況;一方面物理層的故障將會影響虛擬網絡的可用性,導致網絡服務中斷;另一方面不同業務系統間虛擬網絡的增加,安全策略的不同,也進一步增加了網絡配置的復雜度,導致網絡運維極其困難。
(二)虛擬化環境下大二層網絡不斷膨脹
在虛擬化環境下,網絡虛擬機通過bridge方式接入,使得大二層網絡節點不斷增加;同時,為了實現虛擬機在不同物理服務器的自由遷移,將使得VLAN無法隔離廣播域、大二層網絡的不斷膨脹。以上兩種情況,導致整個數據中心被分割成相互獨立的多個業務網絡,極大限制了虛擬機遷移的范圍和用戶網絡的擴展性;同時不斷的網絡冗余將帶來廣播包過多、交換機轉發表溢出、生成樹算法導致帶寬利用率低等問題。
(三)多租戶網絡隔離難以很好的實現
在目前云計算環境下,由于各業務系統共用一套核心交換機、路由器、防火墻等設備,數據中心存在大二層互通的需求, 為了讓大二層可以連通且區分不同租戶,通常采用VLAN技術,其4k的理論數值遠不能滿足當前用戶的需求。同時,在傳統網絡基礎上,很難既滿足云數據中心對IP地址、VLAN、安全等網絡策略統一規劃,又實現各系統間的有效隔離,并支持其個性化要求。
二、SDN技術與網絡虛擬化
SDN(Software Defined Network)軟件定義網絡,是網絡虛擬化的一種實現方式。SDN技術的核心技術OpenFlow通過將網絡設備的控制面與數據面分離,從而實現集中管控和開放可編程,可實現靈活、快速、高效網絡配置。
網絡虛擬化則是云計算和SDN發展到一定階段的產物。網絡虛擬化簡單來講是指把邏輯網絡從底層的物理網絡分離開來。當前,網絡虛擬化主要基于Overlay技術實現,Overlay是一種將(業務的)二層網絡構架在(傳統網絡的)三層/四層報文中進行傳遞的網絡技術。該技術實際上是一種隧道封裝技術,主要有VXLAN、NVGRE、STT這三種技術。VXLAN是目前主流的Overlay技術,將二層報文封裝到udp報文中,擴大二層網絡的范圍,將不同數據中心置于同一個大二層網絡,滿足多數據中心虛擬機遷移和多租戶隔離的需求。
SDN集中控制管理的方式,非常適合用于管理VXLAN多租戶、跨域的虛擬網絡。本文通過實驗,模擬利用SDN控制器實現對整個網絡的統一管理、規劃和控制,理解SDN控制平面和轉發平面分離的模式與openflow協議,檢驗網絡軟件化和網絡可編程化,進一步掌握SDN的openflow和VXLAN技術原理,為省級數據中心網絡架構升級轉型提供實踐經驗。
三、基于SDN架構的VXLAN網絡實驗探索
本文采用虛擬環境模擬兩個數據中心(DC)和SDN控制器,實現兩個數據中心之間VXLAN隧道的建立,不同數據中心同一租戶主機通過VXLAN實現基于三層網絡的二層連接,并隔離不同的租戶;通過SDN控制器下發網絡的VXLAN配置和open vswitch(ovs)的openflow流表,利用流表項控制數據的轉發。
(一)總體規劃
實驗采用三臺虛擬機,兩臺模擬數據中心(dc1、dc2),使用mininet構建網絡拓撲,每個dc包括一臺ovs交換機和兩臺主機,兩臺主機分屬不同的租戶;第三臺虛擬機安裝OpenDaylight(odl)做為SDN控制器。三臺虛擬機分別安裝于不同的物理機,為模擬真實的網絡環境,通過路由器實現虛擬機之間三層網絡連通。
(二)實現步驟
1.構建網絡拓撲。啟動三臺虛擬機,測試虛擬機之間的網絡連通性,三臺虛擬機分屬不同的網段,通過路由器實現三層互聯,拓撲采用Python代碼預先定義,通過Mininet調用來構建。數據中心一(dc1)的拓撲定義文件(dc1.py)主要配置內容如下:
#添加主機和交換機
leftHost=self.addHost('hosta1',ip="192.168.200.1/24",mac="00:00:00:00:aa:01")
rightHost=self.addHost('hostb1',ip="192.168.200.3/24",mac="00:00:00:00:bb:01")
leftSwitch = self.addSwitch( 's1' )
# 增加連接
self.addLink( leftHost, leftSwitch )
self.addLink( rightHost, leftSwitch )
#在dc1虛擬機操作系統命令行輸入以下命令:
sudo mn --custom dc1.py --topo mytopo
--controller=remote,ip=10.160.141.35,protocols=OpenFlow13
dc1的網絡拓撲構建完成后,按同樣方法構建dc2網絡,dc2.py的對應參數根據網絡地址規劃做相應調整。
啟動控制器,安裝必要的組件(feature):
$> feature:install odl-l2switch-all odl-restconf-all odl-nsf-all odl-mdsal-apidocs
$> feature:install odl-ovsdb-southbound-impl odl-ovsdb-southbound-impl-rest odl-openflowplugin-all-li
將ovs openflow版本設為1.3并將交換機設為被動監聽控制器模式,在dc1和dc2上mininet提示符下執行:
mininet> sh ovs-vsctl set bridge s1 protocols=OpenFlow13
mininet> sh ovs-vsctl set-manager ptcp:6640
2.配置VXLAN隧道。采用SDN集中控制的理念,利用odl的restconf南向API接口,通過控制器ovsdb模塊實現VXLAN的配置,配置命令如下:
#將vswitch注冊到odl:
http請求方法:PUT;
URL:http://10.160.141.35:8181/restconf/config/network-topology:network-topology/topology/ovsdb:1
#請求body json使用ODL的YANG UI構造,主要參數:
"topology-id": "ovsdb:1",
"node-id": "mininet1",
"remote-ip": "192.168.101.1",
"remote-port": "6640"
#創建VXLan隧道:
http請求方法:PUT;
URL:http://10.160.141.35:8181/restconf/config/network-topology:network-topology/topology/ovsdb:1/node/mininet1%2Fbridge%2Fs1/termination-point/vxlanport
#請求body json使用ODL的YANG UI構造,主要參數:
"tp-id": "vxlanport",
"ovsdb:name": "vxlanport",
"ovsdb:interface-type": "ovsdb:interface-type-vxlan",
"option": "key",
"option": "remote_ip",
"ovsdb:ofport": "10",
"ovsdb:ofport_request": "10"
以上是針對dc1的配置,dc2的配置應修改相應的參數值。在mininet命令行執行以下命令,檢查vtep是否添加成功:
mininet> sh ovs-vsctl -- --columns=name,ofport list Interface
3.下發openflow流表。上述步驟完成后,基于三層網絡的overlay已搭建完成,但此時ovs交換機中還沒有流表項,需要控制器下發流表才能完成數據的轉發。在下發流表前進行ping測試,實驗中4臺host互不連通。實驗中主要用到流表的匹配字段(match)和指令(instruction)字段,匹配字段類似acl,根據數據包入端口和包頭信息匹配符合條件的數據包,并按指令處理、轉發、丟棄、設置值或轉到下一流表。交換機S1流表項設計如下:
table=0,in_port=1,actions=set_field:100->tun_id,resubmit(,1)
table=0,in_port=2,actions=set_field:200->tun_id,resubmit(,1)
table=0,actions=resubmit(,1)
table=1,tun_id=100,dl_dst=00:00:00:00:aa:01,actions=output:1
table=1,tun_id=200,dl_dst=00:00:00:00:bb:01,actions=output:2
table=1,tun_id=100,dl_dst=00:00:00:00:aa:02,actions=output:10
table=1,tun_id=200,dl_dst=00:00:00:00:bb:02,actions=output:10
table=1,tun_id=100,arp,nw_dst=192.168.200.1,actions=output:1
table=1,tun_id=200,arp,nw_dst=192.168.200.3,actions=output:2
table=1,tun_id=100,arp,nw_dst=192.168.200.2,actions=output:10
table=1,tun_id=200,arp,nw_dst=192.168.200.4,actions=output:10
table=1,priority=10,actions=drop
流表table0根據入端口為數據包設置不同的VNI,并跳轉到流表table1;流表table1根據VNI、目的MAC地址決定數據包轉發的出端口;對于arp請求,根據VNI和目的IP地址決定數據包轉發的出端口。dc2的交換機S2流表根據實際的mac和ip作相應調整。
將以上流表內容保存到名為flows的文本文件,可在mininet下用下述命令下發流表到交換機:
mininet> sh ovs-ofctl add-flows –O openflow13 s1 'flows'
為驗證odl流表下發功能,我們使用odl的restconf API,通過控制器來完成流表下發,以第一條流表為例:
http請求方法:PUT;
URL:http://10.160.141.35:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:1/flow-node-inventory:table/0/flow/1
Json請求body:略
流表需要轉換為符合API要求的json請求body,可通過odl的YANG ui界面,輸入流表項參數后逐條生成,共12條。API調用可使用多種方法實現,如在命令行使用curl命令、使用odl的YANG ui界面、Chrome瀏覽器安裝postman插件、使用編程調用API等。使用用前三種方法,每次只能下發一條流表規則;使用編程調用API,則可實現批量下發,這也體現了SDN網絡可編程控制的特點。
在mininet命令行執行以下命令,檢查流表是否下發成功:
Mininet> sh ovs-ofctl dump-flows -O openflow13 s1
4.連通測試。測試dc1與dc2同一租戶主機網絡連通性:
mininet> hosta1 ping 192.168.200.2
PING 192.168.200.2 (192.168.200.2) 56(84) bytes of data.
64 bytes from 192.168.200.2: icmp_seq=1 ttl=64 time=3.55 ms
mininet> hostb1 ping 192.168.200.4
PING 192.168.200.4 (192.168.200.4) 56(84) bytes of data.
64 bytes from 192.168.200.4: icmp_seq=1 ttl=64 time=3.08 ms
測試不同租戶主機網絡連通性:
mininet> hosta1 ping 192.168.200.4
PING 192.168.200.4 (192.168.200.4) 56(84) bytes of data.
From 192.168.200.1 icmp_seq=1 Destination Host Unreachable
mininet> hostb1 ping 192.168.200.2
PING 192.168.200.2 (192.168.200.2) 56(84) bytes of data.
From 192.168.200.3 icmp_seq=1 Destination Host Unreachable
主機則被隔離,達到了實驗預期的目標。
驗證分析:由于VXLAN是L2 over L4的封裝,以udp報文傳輸,因此僅抓取dc1(192.168.101.1)與dc2(192.168.102.1)之間往來的udp數據包,對實驗結果(如圖2)進行驗證和分析。
從192.168.101.1到192.168.102.1的udp數據包,目的端口已顯示為VXLAN,將其數據載荷部分(data)按VXLAN解碼(如圖3):
data部分被解析為VXLAN數據包,VNI值為100,是租戶A兩臺主機之間的icmp報文。租戶B主機的報文顯示VNI值為200,源地址為192.168.200.3,目的地址為192.168.200.4(如圖4)。
分析可知,數據包進入交換機后,按流表規則加上VNI,并發送到vtep;vtep被封裝成udp報文,通過傳統三層網絡發送到對端vtep,去除udp報頭后按流表規則發送到目的端口。對于同租戶的兩臺主機,雖然位于兩個數據中心,但處于同一個虛擬的大二層,其連接是透明的,可以直接互通。
四、小結
通過模擬省級人民銀行真實網絡環境,旨在對相關原理和技術有更深入的理解和更直觀的認識,為省級數據中心網絡架構升級轉型提供實踐經驗。
通過實驗,探索了openflow流表的設計應用,加深了對openflow規范的理解;VXLAN的構建、openflow流表的下發均由控制器完成,從而將控制面和數據面分離在不同的設備中,使OpenFlow 控制器可同時控制多臺OpenFlow交換機。實踐了SDN網絡集中規劃管理、控制面和數據轉發面分離、網絡軟件化和網絡可編程等特性。下一步將依托實驗結果,探索雙活技術的實現,將省級數據中心主中心雙活的兩臺存儲之一遷移至同城轉接中心,將兩數據中心系統融合為一個統一的虛擬化集群,實現兩中心應用級高可用。
參考文獻:
[1] 魏娜,基于SDN和VXLAN相結合的數據中心構建.科技創新導報.2019年9期
[2] 王穎,龐志鵬,基于SDN的云數據中心網絡[J].通訊世界,2017(16): 3-4.
[3] 陳銳,謝人超,黃韜,等.基于SDN的CDN技術研究[J].電信技術,2014,(6).18-21.
[4] 盧志剛,姜政偉,劉寶旭.一種基于VXLAN的虛擬網絡訪問控制方法[J].計算機工程,2014,(8).86-90,95.doi:10.3969/j.issn.1000-3428.2014.08.016.
作者單位:中國人民銀行天門市支行