虛擬網路:OpenFlow,與OpenStack集成,邊緣虛擬網路

2017-07-24 雲技術社區翻譯組 雲技術實踐

第5章 虛擬網路

本章,我們主要介紹以下內容:

l 基於OpenFlow 實現網路虛擬化

l 與OpenStack Neutron集成配置

l OpenStack和OpenDaylight集成

l 邊緣虛擬網路

l 服務功能鏈(SFC)

簡介

網路虛擬化可以在虛擬環境運行,同時可以把硬體資源跟虛擬網路解耦,提供更高的擴展能力。虛擬化用軟體模擬硬體平台,這樣用一個硬體就可以支持多個虛擬機,按照自己的需要來管理這些虛擬機。NFV(Network Function Virtulization)就是這種能力在網路方面的對應。

配合SDN,NFV的交互能力和定製化能力得到顯著的提高,為數據中心和雲計算提供更細粒度的優化。其中,動態提供和監控、按需提供網路功能帶來的基礎設施水平擴展能力、對生產拓撲更好管理更好理解以及其他的一些好處正在電信生態中體現。這提供了高效、可擴展和可管理的解決方案。在本章中,我們會介紹使用OpenDaylight做網路虛擬化的用法。

Advertisements

基於OpenFlow 實現網路虛擬化

正如公司通常分幾個部門,每個部門都有明確的分工。同樣,網路系統和硬體駐留在不同的部門。 OpenDaylight的虛擬網路租戶項目出於減輕物理網路負荷的考慮,讓軟體處理它。 在配置完成時VTN會自動映射想要的網路能力,這樣用戶只要關心自己要創建的網路功能虛擬實體,而不用去考慮物理網路。 這樣,您將更好地利用資源並減少重新配置網路服務時間。

該項目提供兩個主要組成部分:

VTN Manager:它是與其他模塊交互的內部OpenDaylight應用程序,實現VTN模型的組件。 使用REST API,用戶可以根據需要創建、刪除、更新和刪除(CRUD)VTN組件。

此外,VTN管理器實現OpenStack L2網路功能API。

Advertisements

VTN協調器:作為外部應用程序提供,但是在OpenDaylight發行包發布。它提供REST API來與VTN Manager組件交互,以便定義用戶配置。它是服務和編排層的一部分,支持多控制器編排,並使虛擬網路租戶功能有效。VTN協調器的目的是提供虛擬層2層網路以便互連。主機用虛擬網橋使用VTN管理器組件。

預備條件

此解決方案需要一個虛擬交換機。 如果你沒有任何虛擬交換機,你可以使用Mininet-vm與OvS安裝。可以從網站下載mininet-vm:

https: //github. com/mininet/mininet/wiki/Mininet-VM-Images.。

本章採用OvS 2.3.1的Mininet-VM。你也可以從以下網站得到postman的執行集: https: //www. getpostman.com/collections/d49899eae85985d8e4ba

操作指南

1.使用karaf腳本啟動OpenDaylight。使用腳本訪問karaf CLI:

$ ./bin/karaf

2.安裝面向用戶界面,安裝連接OpenFlow交換機所需的依賴項:

opendaylight-user@root>feature:install odl-vtn-manager-neutron odl-vtn-manager-rest

可能需要一分鐘左右完成安裝。

3.以被動或主動模式將OvS實例連接到OpenDaylight:

使用用戶名和密碼登錄到mininet-vm。

用戶名:mininet

密碼:mininet

使用主動模式連接兩個OvS。

$ sudo ovs-vsctl set-manager tcp:${CONTROLLER_IP}:6640

其中,$ {CONTROLLER_IP}是運行OpenDaylight的主機的IP地址。

現在,我們的虛擬交換機已連接到OpenDaylight:

mininet@mininet-vm:~$ sudo ovs-vsctl show

0b8ed0aa-67ac-4405-af13-70249a7e8a96

Manager "tcp:192.168.0.115:6640"

is_connected: true

ovs_version: "2.3.1"

4.創建包含三個交換機和四個主機的網路拓撲Mininet-VM。使用此命令:

$ sudo mn --controller = remote,ip = $ {CONTROLLER_IP} --topo tree,2

使用以下命令查看拓撲:

mininet> net

5.嘗試從h3 ping h1,動作結果將顯示失敗。因為按原理,交換機2不能到達交換機3:

mininet> h1 ping h3

mininet> h1 ping h3

PING 10.0.0.3 (10.0.0.3) 56(84) bytes of data.

From 10.0.0.1 icmp_seq=1 Destination Host Unreachable

From 10.0.0.1 icmp_seq=2 Destination Host Unreachable

From 10.0.0.1 icmp_seq=3 Destination Host Unreachable

^C

--- 10.0.0.3 ping statistics ---

5 packets transmitted, 0 received, +3 errors, 100% packet

loss, time 4024ms

6. 交換機轉發數據包到控制器時,如果有table-miss,需要添加要求流量。

$ sudo ovs-ofctl add-flow s1 priority = 0,actions = output:CONTROLLER

$ sudo ovs-ofctl add-flow s2 priority = 0,actions = output:CONTROLLER

$ sudo ovs-ofctl add-flow s3 priority = 0,actions = output:CONTROLLER

此步驟只有第一個版本或Beryllium版需要做,Beryllium-SR以後的版本會自動增加這些流表。

7.使用以下請求,創建名為vtn1的虛擬承租人:

type: POST

headers: Authorization: Basic YWRtaW46YWRtaW4=

url: http://localhost:8181/restconf/operations/vtn:update-vtn

payload:

{

"input":{

"tenant-name":"vtn1"

}

}

你會收到代碼200 OK的反饋信息。

8.在先前創建的租戶內創建名為vBr1的虛擬網橋:

type: POST

headers: Authorization: Basic YWRtaW46YWRtaW4=

url: http://localhost:8181/restconf/operations/vtn:update-vtn

payload:

{

"input":{

"tenant-name":"vtn1",

"bridge-name":"vbr1"

}

}

你應該會收到代碼200 OK的反饋信息。

9.在虛擬網橋中創建兩個介面if1和if2:

type: POST

headers: Authorization: Basic YWRtaW46YWRtaW4=

url:

http://localhost:8181/restconf/operations/vtn-vinterface:update-vinterface

payload:

{

"input":{

"tenant-name":"vtn1",

"bridge-name":"vbr1",

"interface-name":"if1"

}

}

收到代碼200 OK的反饋信息。

重複此請求以創建第二個介面,但更改介面名稱與if2。

10. 在交換機內,創建之前創建的介面和實際埠之間的映射。目的是在h1和h3內創建一個橋。在OvS中,h1連接到埠s2-eth1,h3連接到埠s3-eth1。

為了完成映射,我們還需要在OpenDaylight內部的openflow節點與交換機埠建立關聯。它可以通過閱讀openflow節點信息來獲取。

在我們的例子中,s2-eth1與openflow:2相關聯,s3-eth1與openflow:3相關連。

type: POST

headers:Authorization: Basic YWRtaW46YWRtaW4=

url:

http://localhost:8181/restconf/operations/vtn-port-map:set-port-map

payload for host 1:

{

"input":{

"tenant-name":"vtn1",

"bridge-name":"vbr1",

"interface-name":"if1",

"node":"openflow:2",

"port-name":"s2-eth1"

}

}

你應該會收到代碼200 OK的響應。

重複同樣的操作,請務必使用主機3的值替換interface-name,node和port-name

11.主機1現在應該能夠使用創建的虛擬網橋ping主機3:

mininet> h1 ping h3

PING 10.0.0.3 (10.0.0.3) 56(84) bytes of data.

64 bytes from 10.0.0.3: icmp_seq=1

ttl=64 time=47.4 ms

64 bytes from 10.0.0.3: icmp_seq=2

ttl=64 time=0.220 ms

64 bytes from 10.0.0.3: icmp_seq=3

ttl=64 time=0.055 ms

64 bytes from 10.0.0.3: icmp_seq=4

ttl=64 time=0.150 ms

^C

--- 10.0.0.3 ping statistics ---

4 packets transmitted, 4 received,

0% packet loss, time

3002ms

rtt min/avg/max/mdev =

0.055/11.968/47.450/20.485 ms

運轉機制

當把物理埠連接到虛擬介面時,VTN項目將使用埠匹配信息、vlan和mac地址等生成流表並推送到交換機來啟用通信。

請參見每個交換機內的流(僅顯示交換機1,但類似的流存在於其他交換機中):匹配VLAN 0x000的報文

mininet@mininet-vm:~$ sudo ovs-ofctl dump-flows s1 -O OpenFlow13

OFPST_FLOW reply (OF1.3) (xid=0x2):

cookie=0x0, duration=123.379s, table=0, n_packets=48, n_bytes=4080,

priority=0 actions=CONTROLLER:65535

cookie=0x7f56000000000001, duration=118.249s, table=0, n_packets=4,

n_bytes=336, send_flow_rem

priority=10,in_port=2,vlan_tci=0x0000/0x1fff,dl_src=a6:33:4c:dd:fb:9f,

dl_dst=92:bd:3b:89:75:6b actions=output:1

cookie=0x7f56000000000002, duration=118.243s, table=0, n_packets=4,

n_bytes=336, send_flow_rem

priority=10,in_port=1,vlan_tci=0x0000/0x1fff,dl_src=92:bd:3b:89:75:6b,

dl_dst=a6:33:4c:dd:fb:9f actions=output:2

更多信息

使用以下請求檢索完整配置:

type: GET

headers:Authorization: Basic YWRtaW46YWRtaW4=

url:

http://localhost:8181/restconf/operational/vtn:vtns/

刪除租戶的完整配置:

type: POST

headers: Authorization: Basic YWRtaW46YWRtaW4=

url:

http://localhost:8181/restconf/operations/vtn:remove

-vtn

payload:

{

"input":{

"tenant-name":"vtn1"

}

}

與OpenStack neutron集成配置

Networking-odl是OpenStack組件,在Neutron API和OpenDaylight

之間建立連接通道。NeutronNorthbound項目,是OpenDaylight項目的一部分,為Neutron中定義的每個API建立了Yang模型。在Beryllium版本,這些模型可以在項目的github鏡像https: //github. com/opendaylight/neutron/tree/stable/beryllium/model/src/main/yang中找到。這兩個項目的網路框架建立了NFV平台和SDN框架之間的橋樑。

OpenStack的Mechanical Layer 2驅動程序和OpenDaylight Neutron Northbound需要保持他們兩個框架之間相關數據的一致性,保證任何時候數據都能共享。

NeutronNortbound(NN)項目根本不與數據交互。它提供給他們發生Neutron事件時的數據存儲。 Neutron Northbound的消費服務在這些模型上註冊監聽器,這樣就可以基於事件對網路行為進行響應和編程。

在這一節里,我們將演示如何用dummy provider創建網路、子網和埠,所以創建后並不會發生什麼。創建的目的是演示如何使Neutron API集成在OpenDaylight中。

預備條件

本方案需要OpenDaylight,而功能文件需要添加dummy-provider,以便在沒有任何用戶註冊的情況下測試Neutron API(下面將會介紹詳細操作步驟)。

註:由於刪除了dummy provider,該解決方案無法適用於Boron版本。它只適用Lithium and Beryllium版本。

操作指南

1. 使用karaf腳本啟動OpenDaylight karaf。訪問karaf CLI的腳本程序如下:

$ ./bin/karaf

2. 安裝面向用戶的功能,並安裝所有依賴項:

opendaylight-user@root>feature:

install feature:install odl-neutron-service

完成安裝可能需要一分鐘左右。

3. 在karaf CLI上使用以下命令驗證部署

$ web:list

可以看到Web-ContextPath的Web狀態部署為/controller/nb/v2/neutron,這意味著OpenDaylight中的Neutron Northbound Web伺服器已經被部署為可用。

4. 添加一個特性庫引入虛擬提供者,為了測試API需要下載合適的功能文件,不同的版本下載的鏈接不一樣。

Beryllium-SR: https: //raw. githubusercontent. com/j goodyear/OpenDayl

ightCookbook/master/chapter5/chapter5-recipe2/src/main/resources

/features-neutron-test-0. 6. 0-Beryllium-features. xml

Beryllium-SR1:

https: //raw. githubusercontent. com/j goodyear/OpenDaylightCookbook

/master/chapter5/chapter5-recipe2/src/main/resources/features-ne

utron-test-0. 6. 1-Beryllium-SR1-features. xml

Beryllium-SR2:

https: //raw. githubusercontent. com/j goodyear/OpenDaylightCookbook

/master/chapter5/chapter5-recipe2/src/main/resources/features-ne

utron-test-0. 6. 2-Beryllium-SR2-features. xml

然後使用此命令在運行的實例中添加存儲庫的OpenDaylight:

$ feature:repo-add

https://nexus.opendaylight.org/content/

repositories/opendaylight.release/org/

opendaylight/neutron/

features-neutron-test/0.6.0-Beryllium/

features-neutron-test-0.6.0-Beryllium-features.xml

添加后,安裝dummy-provider功能:

$ feature:install odl-neutron-dummyprovider-test

5.添加網路

要執行此操作,您需要發送以下請求,以及有效載荷。正如你可以看到的,有效載荷中定義的UUID是其中一個URL,並且必須匹配

type: POST

headers: Authorization: Basic YWRtaW46YWRtaW4=

url:

http://localhost:8080/controller/nb/v2/neutron/networks/

payload:

{

"networks":[ {

"status":"ACTIVE",

"subnets":[],

"name":"network1",

"admin_state_up":true,

"tenant_id:

"60cd4f6dbc5f499982a284e7b83b5be3",

"provider:network_type":"local",

"router:external":false,

"shared":false,

"id":"e9330b1f-a2ef-4160-

a991-169e56ab17f5",

"provider:segmentation_id":100

} ]

}

使用虛擬提供程序,將發送201 Created請求。

6. 在網路中,為同一租戶添加子網:

type: POST

headers: Authorization: Basic YWRtaW46YWRtaW4=

url:

http://localhost:8080/controller/nb/v2/neutron/subnets/

payload:

{

"subnet": {

"name": "",

"enable_dhcp": true,

"network_id": "e9330b1f-a2ef-

4160-a991-169e56ab17f5",

"tenant_id":

"4fd44f30292945e481c7b8a0c8908869",

"dns_nameservers": [],

"allocation_pools": [ {

"start": "192.168.199.2",

"end": "192.168.199.254"

} ],

"host_routes": [],

"ip_version": 4,

"gateway_ip": "192.168.199.1",

"cidr": "192.168.199.0/24",

"id": "3b80198d-4f7b-4f77-9ef5

-774d54e17126"

}

}

7.在子網中,為同一個租戶創建一個埠:

type: POST

headers:Authorization: Basic YWRtaW46YWRtaW4=

url:

http://localhost:8080/controller/nb/v2/neutron/ports/

payload:

{

"port": {

"status": "DOWN",

"binding:host_id": "",

"name": "port1",

"allowed_address_pairs": [],

"admin_state_up": true,

"network_id": "e9330b1f-a2ef-

4160-a991-169e56ab17f5",

"tenant_id": "4fd44f30292945e481c

7b8a0c8908869",

"binding:vif_details": {},

"binding:vnic_type": "normal",

"binding:vif_type": "unbound",

"mac_address": "fa:16:3e:c9:cb:f0",

"binding:profile": {},

"fixed_ips": [ {

"subnet_id":

"3b80198d-4f7b-4f77-

9ef5774d54e17126",

"ip_address": "192.168.199.1"

} ],

"id": "65c0ee9f-d634-4522-8954-

51021b570b0d"

}

}

工作原理

通過本書前面章節提到的定義模型,我們發送的每個請求都等同於OpenDaylight數據存儲區中的寫入。NeutronNorthbound項目支持比三個基本操作更多的操作,但目的是示範它如何工作、有效載荷,以及如何與OpenStack Neutron API匹配。

OpenStack與OpenDaylight集成

OpenDaylight中的各種子項目正在集成OpenStack,例如VTN項目。本章節我們將專註於一個網路虛擬化項目:NetVirt。

NetVirt是一個使用Open vSwitch DataBase(OVSDB)做南向介面跟Open Vswitch以及硬體VTEP交換機交互的解決方案。 NetVirt項目還支持服務功能鏈(將在下一章節中討論)。

在本小節中,我們將演示OpenStack如何用devstack與OpenDaylight集成使用。

預備條件

這個解決方案需要至少兩個OpenStack節點,一個控制節點和一個計算節點(您可以有多個計算節點)以及一個OpenDaylight發布。 為了您的

方便,我們創建了VirtualBox使用的OVA鏡像,可以輕鬆為使用者設置所有部署。包括OpenStack Liberty 和 OpenDaylightBeryllium。下載地址:https: //drive.google.com/file/d/0B8ihDx8wnbwjMU5nUmttUFRJOEU。

OVA鏡像提供三個節點:

OpenStack control and compute – devstack – OvS – CentOS7

OpenStack compute – devstack – OvS – CentOS7

Router for external access – CentOS6.5

操作指南

1. 打開VirtualBox

如果你沒有安裝VirtualBox,你可以在這裡下載:

https: //www. virtualbox. org/wiki/Downloads

2.將OVA導入VirtualBox

File | Import Appliance

選擇下載的設備:

ovsdbtutorial15_2_liberty_be_external.ova

幾分鐘后,在VirtualBox中有三個新節點,名為:

odl31-control, odl32-compute, router-node

3.啟動前兩個虛擬機,通過終端ssh登陸到虛擬機:

登錄控制節點,密碼為odl:

$ ssh [email protected]

登錄計算節點,密碼為odl:

$ ssh [email protected]

4.為了有效地啟動和配置OpenStack,使用DevStack完成集成:

http: //docs. openstack. org/developer/devstack/

它提供了安裝OpenStack關鍵組件的工具源,允許用戶選擇要使用的服務。

DevStack的配置文件是local.conf。讓我們仔細看看devstack配置文件:

第一行是設置日誌配置,以不同源方向登錄輸出,從而獲得更好的操作效果:

LOGFILE=/opt/stack/logs/stack.sh.log

SCREEN_LOGDIR=/opt/stack/logs

LOG_COLOR=False

由於VM中提供的映像包含所有需要的源代碼和工具,設置以下選項以避免錯誤更新源代碼。

OFFLINE=True

RECLONE=no

VERBOSE=TRUE

禁用所有服務,以便我們可以明確啟用我們需要的:

disable_all_services

啟用核心服務:glance,keystone,nova,vnc,horizon:

n-obj

n-cpu n-cond n-sch n-novnc n-xvnc n-cauth

enable_service horizon

將OpenDaylight設置為Neutron後端引擎,而不是OpenStack L2 agent:

enable_service neutron q-dhcp q-meta q-svc

odl-compute odl-neutron

設置主機信息,您將需要運行的主機的IP地址跑DevStack,這裡是192.168.254.31,必須定義hostname,這裡是odl31:

HOST_IP=192.168.254.31

HOST_NAME=odl31

SERVICE_HOST_NAME=$HOST_NAME

SERVICE_HOST=$HOST_IP

Q_HOST=$SERVICE_HOST

啟用networking-odl插件,使用其存儲庫信息:

當配置為離線時,DevStack將嘗試從/ opt / stack / networking-odl文件夾(這是源代碼實際位於的位置)檢索network-odl存儲庫。

enable_plugin networking-odl

http://git.openstack.org/openstack/networking-odl

關於OpenDaylight的幾個配置必須在配置文件里設置,最重要的是以下:

ODL_PORT=8080

ODL_MGR_IP=192.168.2.11

ODL_L3=True

ODL_PROVIDER_MAPPINGS=br-ex:eth2

您可以指定OpenDaylight IP地址,一個OpenDaylight監聽的埠,L3轉發是否啟用和映射配置,這裡設置br_ex在eth2後面。

如果OpenDaylight在與DevStack(控制節點)相同的主機上運行,將會禁用L3轉發,因為兩個實體使用L2能夠良好通信。但是,如果OpenDaylight在DevStack外部安裝,必須在DevStack和OpenDaylight配置中啟用L3(參見第6條OpenDaylight配置)。

local.conf中剩餘的配置主要是關於OpenStack內部其他功能。

有關配置文件的詳細信息,請訪問:

http: //docs. openstack. org/developer/devstack/configuration. html#local-conf

5. 在控制和計算節點上,編輯local.conf以添加IP地址。

主機運行OpenDaylight:

$ vi /opt/devstack/local.conf

更改IP地址ODL_MGR_IP的值運行主機上的ODL。

6.在OpenDaylight中啟用L3轉發:

$ vi etc / custom.properties

取消註釋第83行以啟用此功能:

ovsdb.l3.fwd.enabled = yes

7.使用karaf腳本啟動OpenDaylight karaf。用以下腳本訪問karaf CLI。

$ ./bin/karaf

8.安裝面向用戶的功能,包括安裝所有依賴項:

opendaylight-user@root>feature:install odl-ovsdb-openstack

完成安裝可能需要一分鐘左右。

9.在每個節點上,執行以下命令:

$ cd /opt/devstack

$ ./stack.sh

完成後,您應該有以下輸出:

This is your host IP address: 192.168.254.31

This is your host IPv6 address: ::1

Horizon is now available at

http://192.168.254.31/dashboard

Keystone is serving at

http://192.168.254.31:5000/

The default users are: admin and demo

The password: admin

註:您應該使用192.168.50.31,而不是使用192.168.254.31作為Horizon IP地址。 原因是因為192.168.254.0子網是一個從主機無法訪問的隔離網路,而192.168.50.0子網可從主機到達。

10.每個節點都有一個OvS實例運行,並配置有兩個網橋:內部(br-int)和外部橋(br-ex)。 使用以下命令,查看輸出拓撲:

[odl@odl31 devstack]$ sudo ovs-vsctl show

6b96af57-f05b-4663-9e1d-180c0c788a5b

Manager "tcp:192.168.1.164:6640"

is_connected: true

Bridge br-ex

Controller "tcp:192.168.1.164:6653"

is_connected: true

fail_mode: secure

Port br-ex

Interface br-ex

type: internal

Bridge br-int

Controller "tcp:192.168.1.164:6653"

is_connected: true

fail_mode: secure

Port br-int

Interface br-int

type: internal

ovs_version: "2.4.0"

11.每個網橋被設置有一組流以便管理服務。這裡是每個橋的流量轉儲:

[odl@odl32 stack]$ sudo ovs-ofctl dump-flows br-int –O OpenFlow13

OFPST_FLOW reply (OF1.3) (xid=0x2):

cookie=0x0, duration=2688.686s, table=0, n_packets=0,

n_bytes=0, dl_type=0x88cc actions=CONTROLLER:65535

cookie=0x0, duration=2688.649s, table=0, n_packets=0,

n_bytes=0, priority=0 actions=goto_table:20

cookie=0x0, duration=2688.649s, table=20, n_packets=0,

n_bytes=0, priority=0 actions=goto_table:30

cookie=0x0, duration=2688.649s, table=30, n_packets=0,

n_bytes=0, priority=0 actions=goto_table:40

cookie=0x0, duration=2688.649s, table=40, n_packets=0,

n_bytes=0, priority=0 actions=goto_table:50

cookie=0x0, duration=2688.649s, table=50, n_packets=0,

n_bytes=0, priority=0 actions=goto_table:60

cookie=0x0, duration=2688.649s, table=60, n_packets=0,

n_bytes=0, priority=0 actions=goto_table:70

cookie=0x0, duration=2688.649s, table=70, n_packets=0,

n_bytes=0, priority=0 actions=goto_table:80

cookie=0x0, duration=2688.649s, table=80, n_packets=0,

n_bytes=0, priority=0 actions=goto_table:90

cookie=0x0, duration=2688.649s, table=90, n_packets=0,

n_bytes=0, priority=0 actions=goto_table:100

cookie=0x0, duration=2688.649s, table=100, n_packets=0,

n_bytes=0, priority=0 actions=goto_table:110

cookie=0x0, duration=2688.649s, table=110, n_packets=0,

n_bytes=0, priority=0 actions=drop

[odl@odl32 stack]$ sudo ovs-ofctl dump-flows br-ex –O OpenFlow13

OFPST_FLOW reply (OF1.3) (xid=0x2):

cookie=0x0, duration=2700.054s, table=0, n_packets=0,

n_bytes=0, dl_type=0x88cc actions=CONTROLLER:65535

cookie=0x0, duration=2700.054s, table=0, n_packets=0,

n_bytes=0, priority=0 actions=NORMAL

內部橋,br-int,設置提供以下流水線:

12.仔細觀察節點的介面配置。 每個節點都共享了相同的內部配置,即:

eth0:VirtualBox NAT地址,10.0.2.15。管理界面可以使用但需要添加VirtualBox埠轉發才能從主機到達。

eth1:租戶流量的內部介面

eth2:浮動IP外部介面

eth3:VirtualBox橋接適配器,192.168.50.3 {1,2}。從主機可達管理介面。

工作原理

使用OpenDaylight的外部實例,必須啟用L3轉發,以便兩個實體(OpenStack控制節點和OpenDaylight)能夠彼此通信。 此外,需要在DevStack配置中設置外部橋接器(eth2)所在的介面。

配置時,控制和計算節點中包含的OvS實例將連接到OpenDaylight。通過OpenFlowPlugin和OpenFlowJava項目,NetVirt項目能夠在這些事件上註冊一個監聽器,從而通過添加內部網橋(br-int)和外部網橋來做出反應。僅當啟用L3轉發時才添加外部網橋。

為了添加這些交換機,NetVirt使用OVSDB南向插件與OVS進行通信。

最後,在交換機內,基本流表被推送,這樣他們就知道如何反應,基於它們的匹配動作向什麼地方發送這些報文。

邊緣虛擬網路

使用OpenStack集成的各種關鍵特性之一是,OpenDaylight可以在主機之間創建虛擬可擴展LAN(VXLAN)、網路實體、網路、子網和埠配置。 使用安全組和安全規則,可以輕鬆地定義埠組的規範,無論是入口或出口埠,並且定義組內規則允許行為。

在本方案中,我們將演示使用vxlan、L3和浮動IP做網路虛擬化。

預備條件

該方案需要至少兩個OpenStack節點、一個控制節點和一個計算節點

(您可以有多個計算節點),以及一個OpenDaylight分佈。使用VirtualBox的OVA映像可以使用戶輕鬆部署。它包含OpenStack Liberty和OpenDaylightBeryllium。下載地址:

https: //drive. google. com/file/d/0B8ihDx8wnbwj MU5nUmttUFRJOEU

OVA圖像提供三個節點:

OpenStack控制和計算 - devstack - OvS - CentOS7

OpenStack計算 - devstack - OvS - CentOS7

外部訪問路由器 - CentOS6.5

操作原理

1.使用先前介紹中完成的設置。如果您還沒有完成配置,請閱讀前面的章節,完成配置。

2.設置Neutron環境

一旦你有準備好的環境,我們就可以開始使用Neutron控制節點,執行以下命令:

$ source openrc admin admin

3.設置具有64 MB內存、無磁碟空間和一個VCPU的nano flavor。flavor是對伺服器定義的硬體配置。

$ nova flavor-create m1.nano auto 64 0 1

以下腳本可用於執行相同的操作:

/opt/tools/os_addnano.sh。

4.創建管理密鑰對:

$ nova keypair-add --pub-key ~/.ssh / id_rsa.pub admin_key

以下腳本可用於執行相同的操作:

/opt/tools/os_addadminkey.sh。

5.創建一個外部flat網路和子網,地址池[192.168.56.9 - 192.168.56.14],網關192.168.56.1和網路192.168.56.0/24:

$ neutron net-create ext-net --router:external

--provider:physical_network public

-- provider:network_type flat

$ neutron subnet-create --name ext-subnet

--allocation-pool

start=192.168.56.9,end=192.168.56.14

--disable-dhcp --gateway 192.168.56.1

ext-net 192.168.56.0/24

6.創建一個外部路由器,並添加上面創建的外部網路作為它

網關:

$ neutron router-create ext-rtr

$ neutron router-gateway-set ext-rtr ext-net

7.創建虛擬可擴展LAN(VXLAN)網路和子網:

$ neutron net-create vx-net

--provider:network_type vxlan

--provider:segmentation_id 1500

$ neutron subnet-create vx-net 10.100.5.0/24

--name vx-subnet --dns-nameserver 8.8.8.8

8.將VXLAN子網添加為步驟5中創建的路由器的介面:

$ neutron router-interface-add ext-rtr vx-subnet

以下腳本可用於執行操作5,6和7:

/opt/tools/os_addextnetrtr.sh.

9.創建兩個虛擬機,並將它們附加到VXLAN:

$ nova boot --poll --flavor m1.nano --image

$(nova image-list | grep 'uec\s' |

awk '{print $2}' | tail -1)

--nic net-id=$(neutron net-list |

grep -w vx-net | awk '{print $2}') vmvx1

--availability_zone=nova:odl31 --key_name admin_key

$ nova boot --poll --flavor m1.nano --image

$(nova image-list | grep 'uec\s' |

awk '{print $2}' | tail -1)

--nic net-id=$(neutron net-list | grep -w vx-net |

awk '{print $2}') vmvx2

--availability_zone=nova:odl32 --key_name admin_key

$ nova get-vnc-console vmvx1 novnc

$ nova get-vnc-console vmvx2 novnc

以下腳本可用於執行相同的操作:

/opt/tools/os_addvms.sh.

10.為每個VM創建浮動IP,以便通過外部可訪問網路:

對於vmvx1 vmvx2:

vm_id=$(nova list | grep $vm | awk '{print

$2}')

port_id=$(neutron port-list -c id -c fixed_ips

--

--device_id $vm_id | grep subnet_id | awk

'{print $2}')

neutron floatingip-create --port_id $port_id

ext-net

done;

以下腳本可用於執行相同的操作:

/opt/tools/os_addfloatingips.sh.

您還可以使用此腳本運行所有這些命令:/opt/tools/os_doitall.sh

這是控制台上運行所有這些命令后的全局輸出:

https://github. com/j goodyear/OpenDaylightCookbook/blob/master/chapter5/cha

pter5-recipe4/src/main/resources/console-output. Txt

11.使用Web UI界面查看創建的拓撲。為此,請安裝karaf中的以下功能:

opendaylight-user@root>feature:install odl-ovsdb-ui

導航到以下網址,請務必更改$ {CONTROLLER_IP}為運行OpenDaylight的主機的IP地址.

http://${CONTROLLER_IP}:8181/index.html#/ovsdb/index

用戶是admin,密碼是admin。

您將能夠看到以下視圖。通過點擊任何組件的視圖,您將被提供有關它的信息。

在bellow視圖中,您可以看到創建的外部和vxlan網路,以及vxlan網路中包含的兩個虛擬機。

您還可以使用OpenStack UI查看類似的拓撲,只需瀏覽以下地址:

http://192.168.50.31/dashboard/project/network_topology/

用戶是admin,密碼是admin。

12.查看OpenDaylight數據存儲中的數據。

OVSDB操作數據存儲:

類型:POST

headers: Authorization: Basic YWRtaW46YWRtaW4=

網址:

http://localhost:8080/restconf/operational/network-topology:network-topology/

Neutron數據存儲 (與OpenStack同步):

網路:

類型: POST

headers: Authorization: Basic YWRtaW46YWRtaW4=

網址:

http://localhost:8080/controller/nb/v2/neutr

on/networks/

子網:

類型: POST

headers: Authorization: Basic YWRtaW46YWRtaW4=

網址:

http://localhost:8080/controller/nb/v2/neutron/subnets/

埠:

類型: POST

headers: Authorization: Basic YWRtaW46YWRtaW4=

網址:

http://localhost:8080/controller/nb/v2/neutron/ports/

安全組:

類型: POST

headers: Authorization: Basic YWRtaW46YWRtaW4=

網址:

http://localhost:8080/controller/nb/v2/neutr

on/security-groups/

安全規則:

類型: POST

headers: Authorization: Basic YWRtaW46YWRtaW4=

網址:

http://localhost:8080/controller/nb/v2/neutron/security-group-rules/

13. 看看OvS拓撲,對於控制和計算,我們可以看到

vxlan隧道已經建立。

期望的控制節點:

https: //github. com/j goodyear/OpenDaylightCookbook/blob/master/chapter5/chapter5-recipe4/src/main/resources/control-node-topo. txt

期望的計算節點:

https: //github. com/j goodyear/OpenDaylightCookbook/blob/master/chapter5/chapter5-recipe4/src/main/resources/compute-node-topo. txt

工作原理

這個部署涉及OpenStack和OpenDaylight。這其中,networking-odl和NeutronNorthbound項目做連接的工作,NetVirt是Neutron事件的消費者。NetVirt項目有偵聽器,當事件發生時,獲得回調,回調將觸發寫入進入OVSDB Southbound插件,更新OvS拓撲。

服務功能鏈

端到端業務通常需要許多業務功能,如網路業務等作為負載平衡器或防火牆,以及特定應用的服務。 為了提供這些功能的動態服務功能鏈,減少對網路拓撲和物理資源的耦合,OpenDaylight創建了SFC項目。利用VM和(或)容器網路,可以有效地創建需要具有完全模塊化和動態的服務鏈的網路服務。

在本小節中,我們將用sfc103演示SFC項目。

https://github.com/opendaylight/sfc/tree/release/beryllium-sr2/sfc-demo/sfc103

此方案的全局網路拓撲如下:

註:以下方案使用的是OpenDaylight Beryllium SR2測試版本,不能保證配置會與其他版本完全一致。

發布。

預備條件

本解決方案需要VirtualBox和一台至少有8G RAM的機器。我們將

使用trusty Ubuntu虛擬機,可以在這裡找到:https: //cloud-images. ubuntu. com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1. box

操作指南

1. .克隆SFC,checkouttag為release/beryllium-sr2的stable/beryllium分支:

$ git clone

https://git.opendaylight.org/gerrit/sfc

$ cd sfc

$ git checkout tabs/release/beryllium-sr2

2. 開始演示安裝(可以全部自動完成,如果想手動完成安裝,請跳過此步驟):

$ cd sfc-demo/sfc103/

$ ./demo.sh

完成安裝,可能需要5到10分鐘。下面的步驟用來解釋自動安裝做了哪些事情。

3. 創建OpenDaylight VM:

資源:4CPU和4GB的RAM

私有IP:192.168.1.5

設置並運行SFC項目。

$ wget

https://raw.githubusercontent.com/jgoodyear/OpenDaylightCookbook/master/chapter5/chapter5-recipe5/src/main/resources/setup_odl.sh

$ ./setup_odl.sh

4. 創建classifier1 VM:

資源:1CPU和1GB的RAM(默認,無需指定)

私有IP:192.168.1.10

安裝先決條件

$ wget

https://raw.githubusercontent.com/jgoodyear/OpenDaylightCookbook/master/chapter5/chapter5-recipe5/src/main/resources/setup_prerequisites.sh

$ ./setup_prerequisites.sh

安裝patched為nhs-aware的OpenVSwitch

$ rmmod openvswitch

$ find /lib/modules | grep openvswitch.ko| xargs rm -rf

$ curl https://raw.githubusercontent.com/priteshk/ovs/nsh-v8/third-party/start-ovs-deb.sh | bash

將OpenDaylight設置為OVS的管理器,並創建初始交換機br-sfc:

$ sudo ovs-vsctl set-manager tcp:192.168.1.5:6640

$ sudo ovs-vsctl add-br br-sfc

創建和配置內部網路命名空間

1)創建一個名為app的新網路命名空間:

$ ip netns add app

2)通過創建虛擬網路介面對將介面分配給網路命名空間veth-app:

$ ip link add veth-app type veth peer

name veth-br

使用命令ip鏈接列表,你應該看到一對虛擬乙太網介面,現在他們屬於「默認」

或「全局」網路命名空間。 為了連接全局veth介面到創建的app命名空間,執行以下操作:

$ ip link set veth-app netns app

3)在br-sfc中創建一個名為veth-br的埠

$ sudo ovs-vsctl add-port br-sfc veth-br

4)將veth-br埠設置為up

$ ip link set dev veth-br up

5)使用以下命令配置我們的app命名空間

給veth-app介面分配一個IP地址並設置:

$ ip netns exec app ifconfig veth-app 192.168.2.1/24 up

6)為veth-app介面的鏈路層分配一個mac地址:

$ ip netns exec app ip link set dev veth-app addr 00:00:11:11:11:11

7)為veth-app創建一個ARP地址映射條目:

$ ip netns exec app arp -s 192.168.2.200:00:22:22:22:22 -i veth-app

8)介面veth-app和lo up:

$ ip netns exec app ip link set dev veth-app up

$ ip netns exec app ip link set dev lo up

9)設置介面veth-app的最大傳輸單元(MTU):

$ ip netns exec app ifconfig veth-app mtu 1400

5. 創建classifier2 VM(步驟類似於步驟4)。

私有IP:192.168.1.10

在執行以下步驟時修改值:

1)使用IP地址192.168.2.2/24

2)使用MAC地址00:00:22:22:22:22

3)使用此命令創建ARP映射:

$ ip netns exec app arp -s 192.168.2.100:00:11:11:11:11-i veth-app

啟動一個簡單的HTTP伺服器,綁定在埠80上面:

$ ip netns exec app python -m SimpleHTTPServer 80

一旦完成步驟4和5,我們有兩個分類器的架構。

6.創建服務功能轉發器VM1:

資源:1CPU和1GB RAM(默認,無需指定)

私有IP:192.168.1.20

安裝先決條件

$ wget

https://raw.githubusercontent.com/jgoodyear/OpenDaylightCookbook/master/chapter5/chapter5-recipe5/src/main/resources/setup_prerequisites.sh

$ ./setup_prerequisites.sh

安裝補丁為nhs-aware的OpenVSwitch

$ rmmod openvswitch

$ find /lib/modules | grep openvswitch.ko| xargs rm -rf

$ curl https://raw.githubusercontent.com/priteshk/ovs/nsh-v8/third-party/start-ovs-deb.sh | bash

將OpenDaylight設置為OVS管理器並創建初始網橋和br-sfc:

$ sudo ovs-vsctl set-manager tcp:192.168.1.5:6640

7. 創建服務功能轉發器VM2:

資源:1CPU和1GB RAM(默認,無需指定)

私人IP:192.168.1.50

安裝先決條件

$ wget https://raw.githubusercontent.com/jgoodyear/OpenDaylightCookbook/master/chapter5/chapter5-recipe5/src/main/resources/setup_prerequisites.sh

$ ./setup_prerequisites.sh

安裝打了nhs-aware補丁的Open Vswitch

$ rmmod openvswitch

$ find /lib/modules | grep openvswitch.ko| xargs rm -rf

$ curl

https://raw.githubusercontent.com/priteshk/ovs/nsh-v8/third-party/start-ovs-deb.sh | bash

將OpenDaylight設置為OVS管理器,並創建初始網橋和br-sfc:

$ sudo ovs-vsctl set-manager tcp:192.168.1.5:6640

8.創建服務功能VM1和VM2。 一個是深度檢查包(DPI),另一個將是防火牆。

為這兩個VM重複以下操作:

資源:1CPU和1GB的RAM(默認,無需指定)

私有IP:192.168.1.30

安裝先決條件

$ wget

https://raw.githubusercontent.com/jgoodyear/OpenDaylightCookbook/master/chapter5/chapter5-recipe5/src/main/resources/setup_sf.sh

$ ./setup_sf.sh

現在我們已經創建和部署了所有拓撲,讓我們進行配置OpenDaylight,使用以下9個請求

9.為以前創建的節點創建服務節點:

type: PUT

headers: Authorization: Basic YWRtaW46YWRtaW4=

url:

http://192.168.1.5:8181/restconf/config/service-node:se

rvice-nodes

payload:

{

"service-nodes":{

"service-node":[

{

"name":"node0",

"service-function":[],

"ip-mgmt-address":"192.168.1.10"

},

{

"name":"node1",

"service-function":[],

"ip-mgmt-address":"192.168.1.20"

},

{

"name":"node2",

"service-function":["dpi-1"],

"ip-mgmt-address":"192.168.1.30"

},

{

"name":"node3",

"service-function":["firewall-1"],

"ip-mgmt-address":"192.168.1.40"

},

{

"name":"node4",

"service-function":[],

"ip-mgmt-address":"192.168.1.50"

},

{

"name":"node5",

"service-function":[],

"ip-mgmt-address":"192.168.1.60"

}]

}

}

10.創建兩個服務功能(DPI和FireWall):

type: PUT

headers: Authorization: Basic YWRtaW46YWRtaW4=

url:

http://192.168.1.5:8181/restconf/config/service-functio

n:service-functions

payload:

{

"service-functions":{

"service-function":[

{

"name":"dpi-1",

"ip-mgmt-address":"192.168.1.30",

"rest-

uri":"http://192.168.1.30:5000",

"type":"dpi",

"nsh-aware":"true",

"sf-data-plane-locator":[

{

"name":"sf1-dpl",

"port":6633,

"ip":"192.168.1.30",

"transport":"service-

locator:vxlan-gpe",

"service-function

forwarder":"SFF1"

}]

},

{

"name":"firewall-1",

"ip-mgmt-address":"192.168.1.40",

"rest-

uri":"http://192.168.1.40:5000",

"type":"firewall",

"nsh-aware":"true",

"sf-data-plane-locator":[

{

"name":"sf2-dpl",

"port":6633,

"ip":"192.168.1.40",

"transport":"service-

locator:vxlan-gpe",

"service-function-

forwarder":"SFF2"

}]

}]

}

}

11.創建服務功能轉發器:

type: PUT

headers: Authorization: Basic YWRtaW46YWRtaW4=

url:

http://192.168.1.5:8181/restconf/config/service-functio

n-forwarder:service-function-forwarders

payload: https: //raw. githubusercontent. com/j goodyear/OpenDay

lightCookbook/master/chapter5/chapter5-recipe5/src/main/res

ources/sff.json

12.創建服務功能鏈:

type: PUT

headers: Authorization: Basic YWRtaW46YWRtaW4=

url:

http://192.168.1.5:8181/restconf/config/service-functio

n-chain:service-function-chains/

payload:

{

"service-function-chains":{

"service-function-chain":[

{

"name":"SFC1",

"symmetric":"true",

"sfc-service-function":[

{

"name":"dpi-abstract1",

"type":"dpi"

},

{

"name":"firewall-abstract1",

"type":"firewall"

} ]

} ]

}

}

13.創建服務功能元數據:

type: PUT

headers: Authorization: Basic YWRtaW46YWRtaW4=

url:

http://192.168.1.5:8181/restconf/config/service-functio

n-path-metadata:service-function-metadata/

payload:

{

"service-function-metadata":{

"context-metadata":[

{

"name":"NSH1",

"context-header1":"1",

"context-header2":"2",

"context-header3":"3",

"context-header4":"4"

} ]

}

}

14.創建服務功能路徑:

type: PUT

headers: Authorization: Basic YWRtaW46YWRtaW4=

url:

http://192.168.1.5:8181/restconf/config/service-functio

n-path:service-function-paths/

payload:

{

"service-function-paths":{

"service-function-path":[

{

"name":"SFP1",

"service-chain-name":"SFC1",

"classifier":"Classifier1",

"symmetric-

classifier":"Classifier2",

"context-metadata":"NSH1",

"symmetric":"true"

} ]

}

}

15.創建服務功能訪問控制列表(ACL):

type: PUT

headers: Authorization: Basic YWRtaW46YWRtaW4=

url:

http://192.168.1.5:8181/restconf/config/ietf-access-con

trol-list:access-lists/

payload: https: //raw. githubusercontent. com/j goodyear/OpenDay

lightCookbook/master/chapter5/chapter5-recipe5/src/main/res

ources/acl. j son

16.創建呈現的服務路徑:

type: POST

headers: Authorization: Basic YWRtaW46YWRtaW4=

url:

http://192.168.1.5:8181/restconf/operations/rendered-se

rvice-path:create-rendered-path/

payload:

{

"input": {

"name": "RSP1",

"parent-service-function-path":

"SFP1",

"symmetric": "true"

}

}

17.創建服務功能分類器:

type: PUT

headers: Authorization: Basic YWRtaW46YWRtaW4=

url:

http://192.168.1.5:8181/restconf/config/service-functio

n-classifier:service-function-classifiers/

payload:

{

"service-function-classifiers": {

"service-function-classifier": [

{

"name": "Classifier1",

"scl-service-function-forwarder": [

{

"name": "SFF0",

"interface": "veth-br"

} ],

"access-list": "ACL1"

},

{

"name": "Classifier2",

"scl-service-function-forwarder": [

{

"name": "SFF3",

"interface": "veth-br"

} ],

"access-list": "ACL2"

} ]

}

}

18. 驗證部署和環境:

在分類器和服務功能轉發器VM中,查看流量:

$ sudo ovs-ofctl dump-flows -OOpenflow13 br-sfc

在創建應用程序網路命名空間時,從classifier1,發送一個wget查詢到classifier2。因為在classifier2中設置一個簡單的HTTP伺服器時,它將響應從而創建流量,並在創建的服務功能鏈內流動。

使用wireshark,觀察數據包。

19.拆除部署:

$ vagrant destroy –f

工作原理

首先,我們必須使用VirtualBox和linux網路命令創建環境,設置分類器。完成後,需要配置服務節點、函數、函數轉發器、鏈、元數據、路徑、訪問控制列表、分類器,以及OpenDaylight數據存儲中的渲染器服務路徑。 為此,我們使用了REST API由OpenDaylight的SFC yang模型。詳細資料可以參閱:https://github. com/opendaylight/sfc/tree/release/beryllium-sr2/sfc-model/src/main/yang。

關於在分類器和服務功能中使用的OpenVSwitch實例轉發器,它已被修改為啟用網路服務頭(NSH),並能夠從OpenFlow規則中封裝和解封裝VXLAN隧道。

編者按

《OpenDaylight Coolbook》這本書由雲技術社區志願者翻譯組翻譯,因為沒有出版紙質書的計劃,本書的翻譯只會翻譯重點章節。

翻譯的過程是譯者和作者思想溝通的過程,也是一個學習的過程,中間充滿艱辛,也充滿快樂。

雲技術越來越成熟,但是雲計算網路技術目前有好幾個流派,OpenDaylight就是其中之一,《OpenDaylight Coolbook》側重概念及實戰,閱讀本書可以快讀了解OpenDaylight。

以下社區優秀翻譯參加了本書的翻譯:

雲技術社區 金牌翻譯 韓衛 第一章

雲技術社區 金牌翻譯 鄧嘉浩 第三章

雲技術社區 金牌翻譯 路君 第四章

雲技術社區 金牌翻譯 劉志紅 第五章

雲技術社區 金牌翻譯 羅晶 第六章

雲技術社區 金牌翻譯 羅瑩 第九章

雲技術社區 金牌翻譯 孟馳 第十章

雲技術社區 金牌翻譯 文傑 第十一章

校對

雲技術社區 金牌翻譯 陳海 第一,三,四章

雲技術社區 金牌翻譯 陳建永 第五,六,九章

雲技術社區 金牌翻譯 黃繼敏 第十,十一章

在此感謝他們辛苦而卓越的付出!

已經發布章節鏈接:

《OpenDaylight Cookbook》第一章:OpenDaylight原理(上)

《OpenDaylight》第一章:OpenDaylight原理(中)

《OpenDaylight》第一章:OpenDaylight原理(下)

《OpenDaylight》第三章:虛擬客戶邊界

《OpenDaylight》第四章:動態互聯(2)

《OpenDaylight》第四章:動態互聯(2)

《OpenDaylight》第四章:動態互聯(3)

未經允許謝絕轉載

Advertisements

你可能會喜歡