1. 程式人生 > >基於openvswitch+Docker構建SDN網路測試環境 (使用ovs-docker進行構建)

基於openvswitch+Docker構建SDN網路測試環境 (使用ovs-docker進行構建)

這是一篇之前寫的筆記,主要記錄了使用openvswitch + Docker 等進行一個小型的SDN網路搭建的操作步驟。由於 之前臨時有其他任務,耽擱了一下,最近開始重新整理,並計劃開發一個簡單的Python指令碼,簡化該網路的建立過程。 同時希望該指令碼可以和控制器的程式進行融合,方便未來可以和docker更容易的結合在一起。專案地址:DockerSDN

以下內容或許存在問題,如果在實現過程中發現問題,可與我聯絡,謝謝、

Date: 2018.7.9 Auther: joliu [email protected]

  • OpenFlow
    • basic knowlege
  • OVS command
    • how to add flow table to open vSwitch
    • how to bind dockers to vSwitch

Install ovs and mininet

Install Docker

Use DaoCloud accelerator

curl -sSL https://get.daocloud.io/docker | sh

Change Docker registry to Aliyun

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xxxxxxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

請替換https://xxxxxxx.mirror.aliyuncs.com,詳細配置內容參見我的另外一篇隨筆CentOS7使用阿里源安裝最新版Docker

Get Basic Docker Image

docker pull alpine

Exercise 1

Create Three Container

docker run -d -i --name RouterA --net=none --privileged alpine sh
docker run -d -i --name RouterB --net=none --privileged alpine sh
docker run -d -i --name RouterC --net=none --privileged alpine sh

Check Containers' Status

[[email protected] ~]$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
37b9ca888f03        alpine              "sh"                About a minute ago   Up About a minute                       RouterC
f1604beb380f        alpine              "sh"                About a minute ago   Up About a minute                       RouterB
3b3c52c5a582        alpine              "sh"                3 minutes ago        Up 3 minutes 

Create Virtual Network Bridge

sudo ovs-vsctl add-br vnbr

Set Protocols

ovs-vsctl set bridge br0 protocols=OpenFlow13

Check the brige is added

[[email protected] ~]$ sudo ovs-vsctl show
d9d42750-7b9b-4688-adf9-d07f619e9bac
    Bridge vnbr
        Port vnbr
            Interface vnbr
                type: internal
    ovs_version: "2.5.0"

Add Network Port

sudo ovs-docker add-port vnbr eth0 RouterA --ipaddress="10.0.1.1/24"
sudo ovs-docker add-port vnbr eth0 RouterB --ipaddress="10.0.1.2/24"
sudo ovs-docker add-port vnbr eth0 RouterC --ipaddress="10.0.3.1"

Check The Status of vnbr

[[email protected] ~]$ sudo ovs-vsctl show
d9d42750-7b9b-4688-adf9-d07f619e9bac
    Bridge vnbr
        Port vnbr
            Interface vnbr
                type: internal
        Port "facad1a218c64_l"
            Interface "facad1a218c64_l"
        Port "d48d429fe1894_l"
            Interface "d48d429fe1894_l"
        Port "12437ccb4eab4_l"
            Interface "12437ccb4eab4_l"
    ovs_version: "2.5.0"

Set OpenFlow Port ID

sudo ovs-vsctl set interface facad1a218c64_l ofport_request=100
sudo ovs-vsctl set interface d48d429fe1894_l ofport_request=200
sudo ovs-vsctl set interface 12437ccb4eab4_l ofport_request=300

Connect to ODL Controller

sudo ovs-vsctl set-controller vnbr tcp:127.0.0.1:6633

Check the Connections with Controller

d9d42750-7b9b-4688-adf9-d07f619e9bac
    Bridge vnbr
        Controller "tcp:127.0.0.1:6633"
            is_connected: true
        Port vnbr
            Interface vnbr
                type: internal
        Port "facad1a218c64_l"
            Interface "facad1a218c64_l"
        Port "d48d429fe1894_l"
            Interface "d48d429fe1894_l"
        Port "12437ccb4eab4_l"
            Interface "12437ccb4eab4_l"
    ovs_version: "2.5.0"

Test the connection between the two host By PING

docker exec -it RouterA ping -c 4 10.0.1.2

Generally, they cannot connect with the other.

Add Flows

sudo ovs-ofctl add-flow vnbr "priority=1 idle_timeout=0,in_port=1,actions=output:2"
sudo ovs-ofctl add-flow vnbr "priority=2 idle_timeout=0,in_port=1,actions=output:1"

Get the Flows from vSwitch

ovs-ofctl -O OpenFlow13 dump-flows vnbr

Test Again.

docker exec -it RouterA ping -c 4 10.0.1.2

Example of the successful result.

[[email protected] ~]$ sudo docker exec -it RouterA ping -c 4 10.0.1.2
PING 10.0.1.2 (10.0.1.2): 56 data bytes
64 bytes from 10.0.1.2: seq=0 ttl=64 time=0.062 ms
64 bytes from 10.0.1.2: seq=1 ttl=64 time=0.061 ms
64 bytes from 10.0.1.2: seq=2 ttl=64 time=0.086 ms
64 bytes from 10.0.1.2: seq=3 ttl=64 time=0.078 ms

--- 10.0.1.2 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.061/0.071/0.086 ms

Start karaf

feature:install odl-restconf odl-l2switch-switch odl-mdsal-apidocs odl-dlux-all