• Openvswitch手册(2): OpenFlow Controller


     131841412179725     131841464202336

     131841472953436

    我们这一节主要来看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

    3-tier architecture

    下面按照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

    image

    当前的拓扑结构如下:

    image

    下面我们只允许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其他机器

    image

    从10.10.10.2 ping其他机器

    image

    从10.10.10.3 ping其他机器

    image

    我们进行下一个实验

    将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

    image

    一开始10.10.10.3能收到并且恢复

    image

    后来我们改变了规则

    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,但是无法恢复

    image

     

     131841479529834

     131841487494191

     131841495145791

     131841503589432

     131841515456204

     131841526247774

  • 相关阅读:
    PSR-2 编码风格规范
    Git中删除冗余的分支
    linux下ssh连接缓慢详解
    pytest框架之fixture详细使用
    如何利用jenkins插件查看allure报告-----完整篇
    CentOS上安装配置Python3.7
    [Python]requests使用代理
    Selenium
    Python性能分析工具-cProfile
    subprocessf运行window程序
  • 原文地址:https://www.cnblogs.com/popsuper1982/p/3800576.html
Copyright © 2020-2023  润新知