zoukankan      html  css  js  c++  java
  • Experimenting with ONOS clustering

     

    ONOS, Open Network Operating System, is a newly released open-source SDN controller that is focused on service provider use-cases. Similar to OpenDaylight, the platform is written in Java and uses Karaf/OSGi for functionality management. Recently we experimented with this controller platform and put together a basic ONOS tutorial that explores the platform and its current features.

    For experimenting with ONOS, we provide two options for obtaining a pre-compiled version of ONOS 1.1.0:

    1. Our tutorial VM that starts the ONOS feature onos-core-trivial when karaf is run.
    2. A Docker repository sdnhub/onos where containers start the ONOS feature onos-core when karaf is run. (Alternatively, here is the Dockerfile)

    Clustering

    In this post, we experiment more with the clustering feature where multiple instances of the controller can be clustered to share state and manage a network of switches. ONOS uses Hazelcast for clustering multiple instances. To experiment with clustering, we perform the following commands to spin up three containers running the ONOS controller in daemon mode:

    $ sudo docker pull sdnhub/onos
    $ for i in 1 2 3; do 
      sudo docker run -i -d --name node$i -t sdnhub/onos;
    done
    $ sudo docker ps
    CONTAINER ID        IMAGE                COMMAND                PORTS                NAMES
    7a6e01a3c174        sdnhub/onos:latest   "./bin/onos-service"   6633/tcp, 5701/tcp   node3               
    92cdc5713b6a        sdnhub/onos:latest   "./bin/onos-service"   5701/tcp, 6633/tcp   node2               
    7731779512b4        sdnhub/onos:latest   "./bin/onos-service"   6633/tcp, 5701/tcp   node1
    

    Hazelcast uses IP multicast to find the other member nodes. In the above system, you can check who the members are by connecting to one of the Docker containers:

    $ sudo docker attach node1
    onos> feature:list -i | grep onos
    Name                 | Installed | Repository          | Description                                       
    -----------------------------------------------------------------------------------------------------
    onos-thirdparty-base | x         | onos-1.1.0-SNAPSHOT | ONOS 3rd party dependencies                       
    onos-thirdparty-web  | x         | onos-1.1.0-SNAPSHOT | ONOS 3rd party dependencies                       
    onos-api             | x         | onos-1.1.0-SNAPSHOT | ONOS services and model API                       
    onos-core            | x         | onos-1.1.0-SNAPSHOT | ONOS core components                              
    onos-rest            | x         | onos-1.1.0-SNAPSHOT | ONOS REST API components                          
    onos-gui             | x         | onos-1.1.0-SNAPSHOT | ONOS GUI console components                       
    onos-cli             | x         | onos-1.1.0-SNAPSHOT | ONOS admin command console components             
    onos-openflow        | x         | onos-1.1.0-SNAPSHOT | ONOS OpenFlow API, Controller & Providers         
    onos-app-fwd         | x         | onos-1.1.0-SNAPSHOT | ONOS sample forwarding application                
    onos-app-proxyarp    | x         | onos-1.1.0-SNAPSHOT | ONOS sample proxyarp application                  
    onos> 
    onos> summary
    node=172.17.0.2, version=1.1.0.ubuntu~2015/02/08@14:04
    nodes=3, devices=0, links=0, hosts=0, SCC(s)=0, paths=0, flows=0, intents=0
    onos> masters 
    172.17.0.2: 0 devices
    172.17.0.3: 0 devices
    172.17.0.4: 0 devices
    onos> nodes
    id=172.17.0.2, address=172.17.0.2:9876, state=ACTIVE *
    id=172.17.0.3, address=172.17.0.3:9876, state=ACTIVE 
    id=172.17.0.4, address=172.17.0.4:9876, state=ACTIVE 
    

    We can see three controllers clustered when we list the summary and nodes. The star next to 172.17.0.2 designates that node as the leader for the state.

    Now we start mininet emulated network with 2 switches, and point them to the controller running in container node2. Since the sample forwarding application is installed, you will see that the ping between two hosts succeeds.

    $ sudo mn --topo linear --mac --switch ovsk,protocols=OpenFlow13 --controller remote,172.17.0.3
    mininet> h1 ping h2 -c 1
    PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
    64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.549 ms
    
    --- 10.0.0.2 ping statistics ---
    1 packets transmitted, 1 received, 0% packet loss, time 0ms
    rtt min/avg/max/mdev = 0.549/0.549/0.549/0.000 ms


    We can visit the web UI of any of the controllers (e.g., http://172.17.0.2:8181/onos/ui/index.html) and get the same information in a graphical format, as shown on the right side..

    OpenFlow Roles and Fault tolerance

    So far, all three controller are in active mode, with only the controller in node2 being the OpenFlow controller used for the devices. Let’s change that and verify that the system can function with multiple controllers with one being the OpenFlow master and others being the slave.

    • Add all controllers to all switches/devices, while mininet is running
    $ sudo ovs-vsctl set-controller s1 tcp:172.17.0.4:6633 tcp:172.17.0.3:6633 tcp:172.17.0.2:6633
    $ sudo ovs-vsctl set-controller s2 tcp:172.17.0.4:6633 tcp:172.17.0.3:6633 tcp:172.17.0.2:6633
    $ sudo ovs-vsctl show
    873c293e-912d-4067-82ad-d1116d2ad39f
        Bridge "s1"
            Controller "tcp:172.17.0.3:6633"
                is_connected: true
            Controller "tcp:172.17.0.4:6633"
                is_connected: true
            Controller "tcp:172.17.0.2:6633"
                is_connected: true
            fail_mode: secure
            Port "s1-eth2"
                Interface "s1-eth2"
            Port "s1"
                Interface "s1"
                    type: internal
            Port "s1-eth1"
                Interface "s1-eth1"
        Bridge "s2"
            Controller "tcp:172.17.0.3:6633"
            Controller "tcp:172.17.0.2:6633"
            Controller "tcp:172.17.0.4:6633"
            fail_mode: secure
            Port "s2-eth2"
                Interface "s2-eth2"
            Port "s2-eth1"
                Interface "s2-eth1"
            Port "s2"
                Interface "s2"
                    type: internal
        ovs_version: "2.3.90"
    
    • Verify ONOS state from the Karaf CLI, especially check the updated list of OpenFlow roles
    $ sudo docker attach node1
    onos>  masters
    172.17.0.2: 0 devices
    172.17.0.3: 1 devices
      of:0000000000000001
    172.17.0.4: 1 devices
      of:0000000000000002
    onos>  roles
    of:0000000000000001: master=172.17.0.3, standbys=[ 172.17.0.4 172.17.0.2 ]
    of:0000000000000002: master=172.17.0.4, standbys=[ 172.17.0.3 172.17.0.2 ]
    
    • Now let’s bring down node2, and see what happens.
    $ sudo docker stop node2
    $ sudo docker attach node1
    onos>  nodes
    id=172.17.0.2, address=172.17.0.2:9876, state=ACTIVE *
    id=172.17.0.3, address=172.17.0.3:9876, state=INACTIVE 
    id=172.17.0.4, address=172.17.0.4:9876, state=ACTIVE 
    onos>  masters
    172.17.0.2: 0 devices
    172.17.0.3: 0 devices
    172.17.0.4: 2 devices
      of:0000000000000001
      of:0000000000000002
    onos>  roles
    of:0000000000000001: master=172.17.0.4, standbys=[ 172.17.0.2 ]
    of:0000000000000002: master=172.17.0.4, standbys=[ 172.17.0.3 172.17.0.2 ]
    

    We notice that the controller in node3 has become the master OpenFlow controller for all two switches. We also noticed that the ping (h1 ping h2) succeeds in the mininet system! We further removed node1 and verified that the system still functions fine with 1 controller and 1 state keeper. This is the power of clustering.

  • 相关阅读:
    AT24C0X I2C通信原理
    Windows文件夹、文件源代码对比工具--WinMerge
    SignalTap导致PCIe Read/Write卡死
    Windows CMD 支持ls命令
    何为内存模型(JMM)?
    何为内存重排序?
    何为安全发布,又何为安全初始化?
    Hibernate入门之many to many关系映射详解
    Hibernate入门之one to many关系映射详解
    Hibernate入门之one to one关系映射详解
  • 原文地址:https://www.cnblogs.com/dream397/p/13181229.html
Copyright © 2011-2022 走看看