Skip to main content

CORD-Trellis Example

Trellis 是 ONF 於 2017 年推出的 Network Architecture Solution,整個架構就於 ONOS SDN Controller 以及 Openflow-Enable switch.

本篇文章主要是在於如何透過 ONF 提供個環境快速搭建一個 Trellis 的測試環境。

Introduction

關於 Trellis 相關 script 的專案真正的位置是放在 ONF 內部的 Project,不過你也可以在 Github看到 Mirror 的版本。 在該 README 有提到該如何架設一個測試環境,因此本篇文章的內容就會基於該 README 去架設一個測試環境。

Environment

基本上該測試環境是基於 mininetONOS 來部署的,所以在機器的數量上面,最少需要一台機器,最多沒有限制,因為 ONOS 本身可以是可以同時跑起多台的 SDN Controller,可以架設一個 Cluster 的環境然後與 Mininet 互連。 不過為了方便測試,並沒有需要架設到這麼多的 ONOS SDN Controller。 因此在本環境中,決定採用兩台機器即可。 所需環境

  1. Two Ubuntu Machine
    • One for ONOS Controller (VM1)
    • One for Mininet emulator (VM2)
  2. 於 VM1 上面請先安裝好 ONOS Controller, 詳細的安裝步驟可以參考 ONF 本身的 wiki, 這邊可以分成使用者跟開發者兩種運行方法,若是開發者本身會要你抓取 ONOS 的 source code,並且透過 buck 來進行建置與運行。此外,也可以直接使用 ONOS docker image 來運行 ONOS
  3. 於 VM2 上面安裝 Ubuntu 16.04 的環境,接下來就可以參考 README 的步驟來設置。

Steps

VM1 (ONOS)

  • 為了更放便控制於 ONOS 上面運行的 application,可以透過環境變數 ONOS_APPS 直接設定要運行的 apps。
  • 透過下列指令控制要運行的 app.
export ONOS_APPS=drivers,openflow,segmentrouting,fpm,dhcprelay,netcfghostprovider,routeradvertisement
  • 運行起 ONOS Controller
  • 另外開視窗,運行 ONOS Cli 工具,透過 apps -a -s 檢查運行的 apps 是否與上述吻合
  • 下載 trellis 相關設定檔案,並且透過下列工具將該設定檔寫入到 ONOS 中,其中 onos-ip 則是本機端的 IP address (此 IP 要讓 VM2 能夠存取得到)
onos-netcfg <onos-ip> routing/trellis/trellis.json

VM2 (Mininet)

  • 安裝相關軟體
sudo apt-get update
sudo apt-get install -y gawk texinfo python-pip build-essential iptables automake autoconf libtool
sudo pip install -U pip
sudo pip install ipaddress
sudo apt-get install isc-dhcp-server
sudo apt-get install mininet
  • 安裝完畢後,魷魚 Trellis 架構內支援使用 Quagga 來當外部 BPG 溝通的橋樑,因此我們需要在本機上安裝 Quagga
  • 這邊要特別注意,在預設情況下, quagga 本身會期望運行的使用者名稱為 quagga,同時你也要幫--sysconfdir以及--localstatedir 這兩個位置的資料夾設定全縣,讓 quagga 此使用者有權限可以寫入。
  • 若是單純測試的話,可以在 configure 的時候加入兩個選項 --enable-user=root --enable-group=root, 這樣 Quagga 相關應用程式就會採用 root 的身份去運行了。
git clone -b onos-1.11 https://gerrit.opencord.org/quagga
cd quagga
./bootstrap.sh
./configure --enable-fpm --sbindir=/usr/lib/quagga
make
sudo make install
cd ..
  • 接下來要修改本地端的檔案,讓我們的 mininet/Zebra 相關的應用程式能夠跟 ONOS 連接得到,所以請修改下列兩個檔案
    • routing/trellis/trellis.py
    • routing/trellis/zebradbgp1.conf
  • routing/trellis/trellis.py,請將下列三行指令中的後面兩行,並且將第一行指令中的 IP 換成 VM1 的 IP
net.addController(RemoteController('c0', ip='<onos-ip>'))
#net.addController(RemoteController('c1', ip='192.168.56.12'))
#net.addController(RemoteController('c2', ip='192.168.56.13'))
  • routing/trellis/zebradbgp1.conf 裡面將 IP 的部分也換成 VM1 的 IP
fpm connection ip <onos-ip> port 2620
  • 接下來要將系統上 kernel 的保護機制 app armor 給關閉,執行下列指令
ln -s /etc/apparmor.d/usr.sbin.dhcpd /etc/apparmor.d/disable/
apparmor_parser -R /etc/apparmor.d/usr.sbin.dhcpd
  • 最後要運行時,切換到 trellis 資料夾,執行 sudo ./trellis.py 即可以運行起 mininet 腳本,並且透過 ONOS GUI 可以觀察到大量的 Switch/Host 存在。
  • 透過下列指令三個指令都可以成功運行並且有回應 (須等待 dhcp 拿到 IP)
mininet$: h1 ping h4
mininet$: h1 ping 10.0.99.2
mininet$: h1v6 ping6 2000::9902
  • 如果要結束整個模擬環境,可以透過下列指令將所有相關的 Process/Daemon 給移除
sudo killall -9 dhclient dhcpd zebra bgpd
sudo mn -c