我们这一节主要来看Controller
Controller有两种:
Primary Controller: 真正控制vswitch的flow table,vswitch会保持和controller的连接,如果失败,取决于bridge的fail mode。一个vswitch可以连接多个Controller,但是这些Controller之间的协作需要Controller自己来做。
Service Controller:仅仅用于support,偶尔操作,maintain使用,如果connection断掉,bridge的fail mode不起作用。
使用floodlight作为controller
下面按照http://networkstatic.net/openflow-openvswitch-lab/
http://networkstatic.net/openflow-starter-tutorial-lab-1/
http://networkstatic.net/openflow-tutorial-lab-2/
http://networkstatic.net/openflow-tutorial-lab-3/
测试controller
创建一个image, qemu-img create -f qcow2 ./images/ubuntu-14.04.img 5G
按照ubuntu
sudo virt-install --virt-type kvm --name ubuntu-14.04 --ram 2048 --noreboot --disk path=/home/cliu8/images/ubuntu-14.04.img,format=qcow2,bus=virtio,device=disk --cdrom=/home/cliu8/images/ubuntu-14.04-server-amd64.iso --network network=default --graphics vnc,listen=0.0.0.0 –noautoconsole
$ ps aux | grep 0.0.0.0 libvirt+ 16500 0.5 0.4 4095256 319416 ? Sl Jun16 0:14 qemu-system-x86_64 -enable-kvm –name ubuntu-14.04 -S -machine pc-i440fx-trusty,accel=kvm,usb=off -m 2048 -realtime mlock=off -smp 1,sockets=1,cores=1,threads=1 -uuid 0f0806ab-531d-6134-5def-c5b495529285 -no-user-config -nodefaults -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/Instance01.monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc -no-shutdown -boot strict=on -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 -drive file=/home/cliu8/images/ubuntu-14.04.img,if=none,id=drive-virtio-disk0,format=qcow2 -device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1 -netdev tap,fd=29,id=hostnet0,vhost=on,vhostfd=32 -device virtio-net-pci,netdev=hostnet0,id=net0,mac=52:54:00:9b:d5:bc,bus=pci.0,addr=0x3 -chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0 -vnc 0.0.0.0:7 -device cirrus-vga,id=video0,bus=pci.0,addr=0x2 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x5
用VNC Client连接到机器,安装好ubuntu
$ sudo virsh dumpxml ubuntu-14.04
我们并不在这台机器上直接操作,因为我们要保存一个原生的ubuntu
创建三个instance:
qemu-img create -f qcow2 -o backing_file=./ubuntu-14.04.img ./instance01.img
$ cat images/instance01.xml
创建一个bridge:
sudo ovs-vsctl add-br helloworld
在另外一台机器上16.158.165.102安装floodlight
apt-get install git
git clone git://github.com/floodlight/floodlight.git
如果有proxy
apt-get install socat
$ cat /usr/bin/gitproxy #!/bin/bash
PROXY=web-proxy.corp.hp.com PROXYPORT=8080 #PROXYAUTH=username:password exec socat STDIO PROXY:$PROXY:$1:$2,proxyport=$PROXYPORT
chmod +x /usr/bin/gitproxy
git config --global core.gitproxy gitproxy
然后再git clone git://github.com/floodlight/floodlight.git
cd floodlight/
apt-get install ant
apt-get install openjdk-7-jdk
nohup java -jar target/floodlight.jar > floodlight.log 2>&1 &
将bridge连接到controller
sudo ovs-vsctl set-controller helloworld tcp:16.158.165.102:6633
$ sudo ovs-vsctl show c24322e6-8453-402a-afaf-64757ef231e9 Bridge helloworld Controller "tcp:16.158.165.102:6633" is_connected: true Port "vnet8" Interface "vnet8" Port "vnet10" Interface "vnet10" Port helloworld Interface helloworld type: internal Port "vnet9" Interface "vnet9" ovs_version: "2.0.1"
登陆http://16.158.165.102:8080/ui/index.html
当前的拓扑结构如下:
下面我们只允许10.10.10.1和10.10.10.3相互ping
$ curl -d '{"switch": "00:00:a2:96:ff:dd:56:45", "name":"static-flow1", "cookie":"0", "priority":"32768", "src-mac":"52:54:00:9b:d5:bc","active":"true", "actions":"output=3"}' http://16.158.165.102:8080/wm/staticflowentrypusher/json {"status" : "Entry pushed"}
$ curl -d '{"switch": "00:00:a2:96:ff:dd:56:45", "name":"static-flow2", "cookie":"0", "priority":"32768", "src-mac":"52:54:00:9b:d5:be","active":"true", "actions":"output=1"}' http://16.158.165.102:8080/wm/staticflowentrypusher/json {"status" : "Entry pushed"}
我们来验证效果
$ sudo ovs-ofctl dump-flows helloworld NXST_FLOW reply (xid=0x4): cookie=0xa00000d7014f7f, duration=873.78s, table=0, n_packets=57, n_bytes=10922, idle_age=170, hard_age=778, dl_src=52:54:00:9b:d5:bc actions=output:3 cookie=0xa00000d7014f80, duration=855.454s, table=0, n_packets=78, n_bytes=19004, idle_age=29, dl_src=52:54:00:9b:d5:be actions=output:1
从10.10.10.1 ping其他机器
从10.10.10.2 ping其他机器
从10.10.10.3 ping其他机器
我们进行下一个实验
将flow table clear掉
curl http://16.158.165.102:8080/wm/staticflowentrypusher/clear/00:00:a2:96:ff:dd:56:45/json
然后我们讲正确的mac导向正确的port
curl -d '{"switch": "00:00:a2:96:ff:dd:56:45", "name":"static-flow1", "cookie":"0", "priority":"32768", "dst-mac":"52:54:00:9b:d5:bc","active":"true", "actions":"output=1"}' http://16.158.165.102:8080/wm/staticflowentrypusher/json
curl -d '{"switch": "00:00:a2:96:ff:dd:56:45", "name":"static-flow2", "cookie":"0", "priority":"32768", "dst-mac":"52:54:00:9b:d5:bd","active":"true", "actions":"output=2"}' http://16.158.165.102:8080/wm/staticflowentrypusher/json
curl -d '{"switch": "00:00:a2:96:ff:dd:56:45", "name":"static-flow3", "cookie":"0", "priority":"32768", "dst-mac":"52:54:00:9b:d5:be","active":"true", "actions":"output=3"}' http://16.158.165.102:8080/wm/staticflowentrypusher/json
这个时候互相的ping的通的
下面我们将导向port3的导向port2,并同时tcpdump在10.10.10.2和10.10.10.3两台机器上。
在机器10.10.10.1上ping 10.10.10.3
一开始10.10.10.3能收到并且恢复
后来我们改变了规则
curl -d '{"switch": "00:00:a2:96:ff:dd:56:45", "name":"static-flow3", "cookie":"0", "priority":"32768", "dst-mac":"52:54:00:9b:d5:be","active":"true", "actions":"output=2"}' http://16.158.165.102:8080/wm/staticflowentrypusher/json
10.10.10.2开始能够收到ping,但是无法恢复
发表评论