我们这一节主要来看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
<domain type='kvm'>
  <name>ubuntu-14.04</name>
  <uuid>0f0806ab-531d-6134-5def-c5b495529284</uuid>
  <memory unit='KiB'>2097152</memory>
  <currentMemory unit='KiB'>2097152</currentMemory>
  <vcpu placement='static'>1</vcpu>
  <os>
    <type arch='x86_64' machine='pc-i440fx-trusty'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <pae/>
  </features>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <emulator>/usr/bin/kvm-spice</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/home/cliu8/images/ubuntu-14.04.img'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </disk>
    <disk type='block' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <target dev='hdc' bus='ide'/>
      <readonly/>
      <address type='drive' controller='0' bus='1' target='0' unit='0'/>
    </disk>
    <controller type='usb' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
    </controller>
    <controller type='pci' index='0' model='pci-root'/>
    <controller type='ide' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
    </controller>
    <interface type='network'>
      <mac address='52:54:00:9b:d5:bb'/>
      <source network='default'/>
      <model type='rtl8139'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <serial type='pty'>
      <target port='0'/>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <input type='mouse' bus='ps2'/>
    <input type='keyboard' bus='ps2'/>
    <graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0'>
      <listen type='address' address='0.0.0.0'/>
    </graphics>
    <video>
      <model type='cirrus' vram='9216' heads='1'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </video>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </memballoon>
  </devices>
</domain>

我们并不在这台机器上直接操作,因为我们要保存一个原生的ubuntu

创建三个instance:

qemu-img create -f qcow2 -o backing_file=./ubuntu-14.04.img ./instance01.img

$ cat images/instance01.xml
<domain type='kvm'>
  <name>Instance01</name>
  <uuid>0f0806ab-531d-6134-5def-c5b495529285</uuid>
  <memory unit='KiB'>2097152</memory>
  <currentMemory unit='KiB'>2097152</currentMemory>
  <vcpu placement='static'>1</vcpu>
  <os>
    <type arch='x86_64' machine='pc-i440fx-trusty'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <pae/>
  </features>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <emulator>/usr/bin/kvm-spice</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/home/cliu8/images/instance01.img'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </disk>
    <controller type='usb' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
    </controller>
    <controller type='pci' index='0' model='pci-root'/>
    <controller type='ide' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
    </controller>
    <interface type='bridge'>
      <mac address='52:54:00:9b:d5:bc'/>
      <source bridge='helloworld'/>
      <virtualport type='openvswitch' />
      <model type='virtio'/>
    </interface>

    <serial type='pty'>
      <target port='0'/>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <input type='mouse' bus='ps2'/>
    <input type='keyboard' bus='ps2'/>
    <graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0'>
      <listen type='address' address='0.0.0.0'/>
    </graphics>
    <video>
      <model type='cirrus' vram='9216' heads='1'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </video>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </memballoon>
  </devices>
</domain>

创建一个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,但是无法恢复

Openvswitch手册(2): OpenFlow Controller的更多相关文章

  1. Openvswitch手册(1): 架构,SSL, Manager, Bridge

    Openvswitch是一个virutal swtich, 支持Open Flow协议,当然也有一些硬件Switch也支持Open Flow协议,他们都可以被统一的Controller管理,从而实现物 ...

  2. Openvswitch手册(9): Flow

    这一节我们将flow table flow table主要由ovs-ofctl命令操作 ovs-ofctl可以走和openflow controller一样的协议: ssl:ip[:port]: Th ...

  3. Openvswitch手册(4): Mirror

    这一节我们来分析Mirror Mirror就是配置一个bridge,将某些包发给指定的mirrored ports 对于包的选择: select_all,所有的包 select_dst_port se ...

  4. Openvswitch手册(6): QoS

    这一节我们看QoS,Qos的设置往往是和flow中的policy一起使用的 Open vSwitch QoS capabilities 1 Interface rate limiting 2 Port ...

  5. Openvswitch手册(7): Interfaces

    我们来看Interfaces ofport: OpenFlow port number for this interface. type: system: An ordinary network de ...

  6. Openvswitch手册(8): ovs-vsctl的DB的操作

    ovs-vsctl的DB的操作 如果你在命令行里面找不到相应的命令创建和删除对象,则可以直接删除数据库 [−−if−exists] [−−columns=column[,column]...] lis ...

  7. Openvswitch手册(3): sFlow, netFlow

    这一节,我们重点看sFlow 采样流sFlow(Sampled Flow)是一种基于报文采样的网络流量监控技术,主要用于对网络流量进行统计分析. sFlow系统包含一个嵌入在设备中的sFlow Age ...

  8. Openvswitch手册(5): VLAN and Bonding

    我们这一节来看Port 一般来说一个Port就是一个Interface,当然也有一个Port对应多个Interface的情况,成为Bond VLAN Configuration Port的一个重要的方 ...

  9. OpenvSwitch/OpenFlow 架构解析与实践案例

    目录 文章目录 目录 前言 软件定义网络(SDN) 虚拟交换机(vSwitch) 为什么说云计算时代的 SDN 非常重要 OpenFlow 简介 Open vSwitch Open vSwitch 的 ...

随机推荐

  1. vcenter 不可访问虚拟机

    因为虚拟机找不到路径了,要么是删了,要么阵列顺序乱了什么的. 进入vsphere client: 储存器适配器里扫描一下,或者直接就已经识别了. 进入储存器里,全部扫描一下,或手动添加一下即可.

  2. python字符串的魔法

    *首字母大写test="aslf"v=test.capitalize()print(v) *所有字母变成小写test="QWFDE"v=test.casefol ...

  3. Zookeeper使用--命令行

    一.前言 在学习了Zookeeper相关的理论知识后,下面接着学习对Zookeeper的相关操作. 二.Zookeeper部署 Zookeeper的部署相对来说还是比较简单. Zookeeper有三种 ...

  4. vue如何使用rules对表单字段进行校验

    基于element-ui 1.在代码中,添加属性::rule <el-form :model="form" :rules="rules" ref=&quo ...

  5. Layer 创建 和 lamdba function 创建 和 API GateWay 配置 和 添加依赖

    进入控制台 选择 Lamdba 服务 进入控制面板, 单击右边: 创建函数 然后进入此图界面 添加lamdba 函数 名称 选择运行环境:python 选择角色 选择现有角色, 角色创建 可以参考 无 ...

  6. spark2.0源码学习

    [Spark2.0源码学习]-1.概述 [Spark2.0源码学习]-2.一切从脚本说起 [Spark2.0源码学习]-3.Endpoint模型介绍 [Spark2.0源码学习]-4.Master启动 ...

  7. 上传到HDFS上的文件遇到乱码问题

    1.通过eclipse中的hdfs插件上传文件,上传成功,但是查看是乱码. 查阅文件本身的编码方式,发现是utf-8,同时文件在项目目录下,显示正常,因为我把它的编码格式也设成了utf-8. 2.通过 ...

  8. Django form验证

    # 模版 class LoginForm(forms.Form): # 模版中的元素 user = forms.CharField(min_length=6,error_messages={" ...

  9. Android.mk学习

    2019-03-31 学习变量 $(call my-dir) /usr/bin2/android-ndk-r16/build/core $(CLEAR_VARS) /usr/bin2/android- ...

  10. react-01

    比较了半天VUE.Angular.React,最终选择React,下面从几个例子开始React的学习,先从单个的index.html,引用react.js开始 一.最简单的纯JS的代码 <!DO ...