4.基于RESTCONF的流表管理

实验原理

所谓流表,其实可被视作是SDN对网络设备的数据转发功能的一种抽象。在传统网络设备中,交换机和路由器的数据转发需要依赖设备中保存的二层MAC地址转发表或者三层的IP地址路由表,SDN交换机中使用的流表也是如此,不过在它的表项中整合了网络中各个层次的网络配置信息,从而在进行数据转发时可以使用更丰富的规则。

在使用RESTCONF下发流表时,需要学习的是请求消息的BODY的结构。实例如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<flow xmlns="urn:opendaylight:flow:inventory">
    <flow-name>add-flow</flow-name>
     <table_id>0</table_id>
    <id>100</id>
     <strict>false</strict>
   <priority>1</priority>
     <instructions>
         <instruction>
             <order>0</order>
             <apply-actions>
                 <action>
                     <order>0</order>
                     <output-action>
<output-node-connector>FLOOD</output-node-connector>
                    </output-action>
                </action>
            </apply-actions>
        </instruction>
    </instructions>
    <match>
    </match>
</flow>

BODY中定义了流表名称(flowname)、flow所在的table(table_id)、flow的id(id)、是否严格匹配(strict)、优先级和匹配字段(match fields)、优先级(priority)、指令(instructions)、超时(timeouts)、cookie等值。

实验拓扑

拓扑.png

创建实验

步骤1 登录交换机查看网络连通性。由于OpenDaylight组件过于庞大,所以启动比较慢,容易导致控制器与交换机连接不成功的现象,间接导致主机无法获取IP。所以使用OpenDaylight控制器时,需要先检查网络连通性,查看交换机与控制器连接情况。执行以下命令:

ovs-vsctl show

出现“is_connected: true”,表明控制器与交换机连接成功。

步骤6 登录交换机,执行如下命令连接控制器。

ovs-vsctl set-manager tcp:20.0.1.3:6640

原本控制器与交换机之间的连接是通过OpenFlow协议的,在此基于OVSDB协议创建一个新的连接,其中20.0.1.3是控制器IP地址,6640是OVSDB协议对应的侦听端口。

删除ODL自动下发的流表

在实验过程中需要验证两个不能通信的主机,通过REST北向接口下发流表,使得两个主机能够通信,所以需要删除原先的默认通信流表。

步骤1 登录交换机,执行如下命令删除流表,如下图所示。

ovs-ofctl del-flows -O OpenFlow13 br-sw

1.png
步骤2 执行ovs-ofctl dump-flows -O OpenFlow13 br-sw查看是否删除成功,如下图所示。
2.png
步骤3 登录其中的一个主机,查看主机间网络网络连通情况,此时主机间无法进行通信,如下图所示。
3.png

下发通信流表

步骤1 登录控制器,打开浏览器,输入URL:http://[controller_ip]:8181/index.html,输入有户名:admin,密码:admin,单击登录。登录后,单击Nodes菜单,获取交换机node id,如下图所示。
4.png
步骤2 单击Applications Menu/Development/Postman打开postman应用,如下图所示。
5.png
步骤3 输入URL http://[controller-ip]:8181/restconf/config/opendaylight-inventory:nodes/node/[node-id]/table/0/flow/100。

[controller-ip]为当前控制器的数据层的ip,[node-id]即步骤1中获得的node id请求类型选择PUT。问一个页面需要输入用户名和密码,同样,用Postman发送请求也需要一定的权限。单击Authorization,type选择basic auth。输入用户名和密码,用户名和密码都是admin。选择BODY的类型raw ->XML(application/xml),如下图所示。
6.png
步骤4 输入Body内容如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<flow xmlns="urn:opendaylight:flow:inventory">
    <flow-name>add-flow</flow-name>
    <table_id>0</table_id>
    <id>100</id>
    <installHw>false</installHw>
    <strict>false</strict>
  <priority>1</priority>
    <instructions>
       <instruction>
           <order>0</order>
           <apply-actions>
               <action>
                   <order>0</order>
                   <output-action>
<output-node-connector>FLOOD</output-node-connector>
                   </output-action>
                </action>
            </apply-actions>
            </instruction>
    </instructions>
    <match>
    </match>
</flow>
注意:严格区分大小写

步骤5 点击Send按钮,输出结果如下图所示。
7.png
步骤6 输入URL http://[controller-ip]:8181/restconf/config/opendaylight-inventory:nodes/node/[node-id]/table/0/。[controller-ip] 为当前控制器的数据层的ip,[node-id]即【四、下发通信流表】步骤1获得的node id请求类型选择GET。问一个页面需要输入用户名和密码,同样,用Postman发送请求也需要一定的权限。单击Authorization,type选择basic auth。输入用户名和密码,用户名和密码都是admin,如下图所示。
8.png
步骤7 点击Send按钮,输出结果如下图所示。
9.png
可以看到,此流表为之前通过REST北向接口下发的流表。

步骤8 登录其中的一个主机,查看主机间网络网络情况,此时主机间能够进行通信。

使用Postman删除流表

步骤1 输入URL http://[controller-ip]:8181/restconf/config/opendaylight-inventory:nodes/node/[node-id]/table/0/flow/[flow-id]。

[controller-ip]为当前控制器的数据层的ip,[node-id]即【四、下发通信流表】步骤1获得的node id,[flow-id]为之前下发流表的id,可以到【四、下发通信流表】的BODY中查看。请求类型选择DELETE.访问一个页面需要输入用户名和密码,同样,用Postman发送请求也需要一定的权限。单击Authorization,type选择basic auth。输入用户名和密码,用户名和密码都是admin。点击Send,如下图所示。
10.png
步骤2登录交换机,切换至root用户。执行命令ovs-ofctl dump-flows -O OpenFlow13 br-sw,可验证流表已删除,如下图所示。
11.png