天天看點

OpenDaylight學習筆記

文章來源:http://www.openstack.cn/p554.html

在我看來,SDN的本質從技術上講主要是下面三點:

1)有一個控制器,用于将控制流和資料流分離。交換機向控制器請示将資料包往哪個端口轉發。交換機和控制器之間的南橋協定有一個标準叫OpenFlow,但并不是所有廠家都願意遵守标準的。OpenDayLight除了支援OpenFlow協定以外,也支援其他的一些協定。

2)将租戶tenant的概念做到了交換機之中。雲計算的本質就是向租戶租服務,服務對于租戶應該是隔離的。傳統的二層網絡用VLAN做隔離,現在還要加上tenant做隔離。隻不過以前tenant這個概念做在應用層,現在直接下層到L2層了。另外,VLAN有很多缺點(如vlan号隻能對1-4094,這個對于公有雲不合适,且需要配置實際實體交換機),是以可以通過像GRE之類的一些遂道技術再自定義幀頭,在幀頭中就可以自定義類似于vlan及tenant的隔離概念,就像一個應用程式一樣,通過socket發出去,接收方再通過自定義協定解析資料。

3)控制器向要提供北橋API,供使用者調用來實作軟體定義網絡。

、  經過今天一天對opendaylight的初步學習,達到了幾下目的。

1)opendaylight長成什麼樣子,它的原理熟悉了。除了CLI及REST APIs沒有細看以外,其他high level一點的也都能了解了。

2)雖然openstack的opendaylight插件的代碼還沒有出來,但能夠想象它今後會怎麼在openstack中運用。也清楚了這個插件怎麼寫的大緻步驟。

3)熟悉了mininet的用 法,mininet是一個用在一台機器上模拟openflow實驗環境的。它的實作原理是:采用root namespace做openflow交換機,其他的每一個host就是一個namespace,host與switch之間通過veth對等裝置相連。

但由于opendaylight的文檔非常不清晰,有一點不是太明白,導緻後面的實驗沒有做:

1)不清楚下列設定controller-node的指令的nodeA是怎麼來的,nodeA應該是資料庫的一個類似于uuid的值,但不清楚什麼指令可以得到它。

oscp(config)# controller-node <nodeA>

安裝OpenDayLight控制器

可以從源碼編譯,也可以直接下載下傳編譯好的OpenDayLight Controller(https://jenkins.opendaylight.org/controller/job/controller- nightly/lastSuccessfulBuild/artifact/opendaylight/distribution /opendaylight/target/),我們選擇直接從源碼編譯的方式:

1, 安裝maven,java, ant ( sudo yum install ant)之類的軟體,下面說maven的安裝步驟:

http://mirror.bit.edu.cn/apache/maven/maven-3/3.0.5/binaries/apache-maven-3.0.5-bin.zip

解壓後,直接在~/.bashrc檔案中設定下列環境變量即可:

export JAVA_HOME=/bak/java/jdk1.7.0_21

export M2_HOME=/bak/java/apache-maven-3.0.5

export MAVEN_OPTS=”-Xms256m -Xmx512m”

export PATH=$JAVA_HOME/bin:$M2_HOME/bin:$PATH

2,下載下傳OpenDayLightController的代碼,并編譯:

git clone https://git.opendaylight.org/gerrit/p/controller.git

cd controller/opendaylight/distribution/opendaylight/

mvn clean install (這步偶爾第一次執行會出錯,出錯後加-X參數再執行一遍就可以了)

3, 啟動OpenDayLightController,

cd controller/opendaylight/distribution/opendaylight/target/distribution.opendaylight-0.1.0-SNAPSHOT-osgipackage/opendaylight

./run.sh

然後就可以在浏覽器中通路連結http://localhost:8080

4,(可選)eclipse開發環境環境建立如下:

1)在eclipse中安裝maven插件 (eclipse market裡找maven integration for eclipse)

2)導入“existing maven project”, 我将workspace設定為:/bak/opendaylight/controller

3)  設定OSGI的target, controller/opendaylight/distribution/opendaylight/opendaylight.target

4)  以debug模式啟動opendaylight-osgi-launcher

5)opendaylight Gerrit的位址,https://git.opendaylight.org/gerrit/

或者用其他openflow控制器,如floodlight, http://docs.projectfloodlight.org/display/floodlightcontroller/Installation+Guide

$ git clone git://github.com/floodlight/floodlight.git
$ cd floodlight
$ git checkout fl-last-passed-build
$ ant      

$java -jar target/floodlight.jar # run Floodlight

http://localhost:8080/ui/index.html

安裝mininet

mininet目前不能運作在64位系統上,不得不下載下傳virtualbox鏡像 http://floodlight.openflowhub.org/files/floodlight-vm.zip

啟動mininet,并連接配接控制器

sudo mn  –controller=remote –ip=192.168.99.104  –port=6633 –mac –topo=tree,depth=2

或簡單的,sudo mn –controller=remote –ip=192.168.99.104 –port=6633

[email protected]:/home/floodlight# dpctl show tcp:127.0.0.1:6634

features_reply (xid=0xc1d3ddd4): ver:0x1, dpid:1

n_tables:2, n_buffers:256

features: capabilities:0x87, actions:0xfff

 1(s1-eth1): addr:f2:91:cb:40:c7:5a, config: 0, state:0

     current:    10GB-FD COPPER 

 2(s1-eth2): addr:1a:91:f7:1e:2a:be, config: 0, state:0

     current:    10GB-FD COPPER 

 3(s1-eth3): addr:16:04:cc:cb:59:de, config: 0, state:0

     current:    10GB-FD COPPER 

 LOCAL(dp0): addr:00:23:20:89:2d:61, config: 0x1, state:0x1

get_config_reply (xid=0x9f508db3): miss_send_len=0

[email protected]:/home/floodlight# dpctl dump-flows tcp:127.0.0.1:6634

stats_reply (xid=0x77dd14d8): flags=none type=1(flow)

[email protected]:/home/floodlight# sudo dpctl add-flow tcp:127.0.0.1:6634 in_port=1,idle_timeout=360,actions=output:2

[email protected]:/home/floodlight# dpctl dump-flows tcp:127.0.0.1:6634

stats_reply (xid=0x469554d): flags=none type=1(flow)

  cookie=0, duration_sec=2s, duration_nsec=939000000s, table_id=0, priority=32768, n_packets=0, n_bytes=0, idle_timeout=360,hard_timeout=0,in_port=1,actions=output:2


        
OpenDaylight學習筆記

OpenDaylight SDN Controller Platform (OSCP)

注意,OpenDayLight Controller和OSCP實際上2個獨立的SDN控制器項目(分别由Cisco和BigSwitch承當)。不過,BigSwitch于6月份退出 OpenDayLight(降級為silver member),OSCP這個項目基本上也就廢棄了(從2013-06起就沒有更新過)

git clone ssh://[email protected]:29418/net-virt-platform.git
./setup.sh
make
java -jar target/sdnplatform.jar 
source ./workspace/ve/bin/activate 
make stop-sdncon reset-cassandra start-sdncon (OSCP REST APIs實作在一個單純的程序sdncon中)
java -jar sdnplatform/target/sdnplatform.jar

GUI位址:http://192.168.99.100:8000/ 

運作CLI指令 ( https://wiki.opendaylight.org/view/OpenDaylight_Command-Line_Interface_(CLI):Main):
[[email protected] net-virt-platform]$ cd cli/
[[email protected] cli]$ ./cli.py 
version200
default controller: 127.0.0.1:8000, SDN OS 1.0 - custom version
laptop> help
For help on specific commands type help <topic>
Commands:
  clearterm   Clears and resets the terminal screen
  connect     Connect to a controller's REST API
  date        Display current date and time
  debug       Manage various cli debugging features
  echo        Echo remaining arguments
  enable      Enter enable mode
  exit        Exit current mode
  help        Help on commands or topics
  history     Display history of commands
  logout      Exit from cli
  no          Delete or disable configuration parameters
  ping        ping a switch or ip address
  set         Manage CLI sessions settings
  show        Show links, controller managed switch to switch interfaces
  test        Perform various tests on the network
  trace       Determine the L3 path to some destination
  traceroute  Determine the L3 path to some destination
  tunnel-link
  version
  watch       Iterate indicated command displaying results
laptop> show switch
# Switch DPID             Alias Connected Since         IP Address     Tun Capable -Enabled -State   Core Switch
-|-----------------------|-----|-----------------------|--------------|-----------|--------|--------|-----------
1 00:00:00:00:00:00:00:01       2013-06-23 17:34:35 CST 192.168.99.104 False       False disabled False
laptop> show host
# MAC Address       Address Space VLAN IP Address Switch/OF Port (Physical Port)      Tag Last Seen
-|-----------------|-------------|----|----------|-----------------------------------|---|---------
1 32:a7:38:9c:83:9b default            Unknown    00:00:00:00:00:00:00:01/1 (s1-eth1)     0 minute
2 ae:60:9e:e8:38:9b default            Unknown    00:00:00:00:00:00:00:01/2 (s1-eth2)     0 minute
3 b2:04:d3:3c:d9:79 default            Unknown    00:00:00:00:00:00:00:01/3 (s1-eth3)     0 minute
laptop> show link
None.

eclipse:
1) make eclipse
2) Import "sdnplatform" project into any eclipse workspace
      

OpenDaylight Network virtualization (ONV)

ONV是運作在OSCP平台上的一個NaaS應用,坐标相當于OpenStack Neutron。

它具有:

1. tenant隔離

  1. 3層路由功能
  2. Opendaylight的quantum插件調用ONV的北橋APIs

OpenDaylight Neutron插件

今後opendaylight會往社群提供一個插件,位于neutron/plugin/oscp,它有一個RestProxy會去調OSCP的RESTAPIs,有點類似于floodlight的那個rest插件,不過好像代碼還沒送出進去,我們先猜測一下它的用法。估計用devstack的話,配置得至少多出幾列幾項:

enable_service oscp
Q_PLUGIN=oscp
BS_FL_CONTROLLERS_PORT=<ip_address:port>
BS_FL_CONTROLLER_TIMEOUT=10      

這些步驟分解的話,應該是:

1)配置所有節點上的OVS使用openflow控制器

NETWORK_CONTROLERS=<comma-seperated-list-of-network-ctrls>
sudo ovs-vsctl \--no-wait \-\- \--if-exists del-br br-int
sudo ovs-vsctl \--no-wait add-br br-int
sudo ovs-vsctl \--no-wait br-set-external-id br-int bridge-id br-int
for ctrl in `echo ${NETWORK_CONTROLERS} \| tr ',' ' '`
do
 sudo ovs-vsctl set-controller br-int "tcp:${ctrl}:6633"
done      

2)資料庫及配置

$ mysql -u root -p$PASS -e 'DROP DATABASE IF EXISTS oscp_neutron;'
$ mysql -u root -p$PASS -e 'CREATE DATABASE IF NOT EXISTS oscp_neutron;'      

vi /etc/quantum/neutron.conf

[DEFAULT]
core_plugin = neutron.plugins.oscp.plugin.RestProxy
allow_overlapping_ips = False
lock_path = <path_to_which_neutron_process_can_write_to>
vi /etc/neutron/plugins/oscp/restproxy.ini
[DATABASE]
sql_connection = mysql://<username>:<password>@<database_ip>:3306/restproxy_neutron
[RESTPROXY]
servers=<controller_ip:port_num>,<controller_ip:port>
serverauth=<username>:<password>
serverssl=False      

vi /etc/nova/nova.conf

libvirt_vif_type=ethernet
libvirt_vif_driver=nova.virt.libvirt.vif.LibvirtHybridOVSBridgeDriver
3)啟動
neutron-server --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/oscp/restproxy.ini      

要開放控制節點提供REST接口的端口,好像neutron插件能通路:https://wiki.opendaylight.org/view/OpenDaylight_Network_Virtualization_(ONV):OpenStack

OpenDaylight的文檔不是很清晰,暫不清楚下面的nodeA的值怎麼得來?

oscp> enable

oscp# configure

oscp(config)# controller-node <nodeA>

oscp(config-controller)# interface Ethernet 0

oscp(config-controller-if)# firewall allow  web

用指令行檢視:show controller-node all

用RESTAPI檢視:http://192.168.99.100:8000/rest/v1/model/controller-node

如果它要用到外部網關的話,也得像用neutron的cli指令那樣調用OSCP的CLI指令配置外部網關,見:https://wiki.opendaylight.org/view/OpenDaylight_OpenStack_Quantum_Plugin:Main

參考:

REST API doc,https://wiki.opendaylight.org/view/OpenDaylight_SDN_Controller_Platform_(OSCP):Rest_Reference

CLI doc, https://wiki.opendaylight.org/view/OpenDaylight_Command-Line_Interface_(CLI):Main