之前提到,VTN的作用是提供虚拟租户网络,准确的说是通过创建逻辑层面的网络实现虚拟网络功能,那么我们实实在在的的主机如何通过逻辑网络进行联通呢?一个物理网络,一个逻辑网络(VTN网络),两个网络之间本不存在任何关联。VTN基于映射map的方式,将逻辑网络就和物理网络关联在一起,而这个逻辑网络我们可以人为编排,相比而言,灵活很多。map有三种方式实现,分别是port map 、mac map以及vlan map,这里我们先进行port map的功能研究,其他方式后面文章会有讲述。
二层虚拟网络功能主要是通过VTN管理器下发API方式实现。下面通过一个简单的openflow交换网络利用port map来测试该功能并介绍一些api的使用。
上图一个由openflow交换机组成的物理网络,一个逻辑网络,物理网络中各主机间互不相通。但是,将host1、host3映射到同一个逻辑网络中,就可以实现host1与host3之前的互通。后面会简述下作业原理。
下面我们进行功能验证:
1.通过mininet 搭建如上的物理网络:
执行如下命令创建两个三个交换机以及四个host:
sudo mn --controller=remote,ip=192.168.0.100 --topo tree,2
#ip为odl控制器的ip,使当前创建的网络被odl管理,方便后期odl通过vtn manager下发api进行配置
在mininet终端中通过net命令检查网络拓扑,如下:
可以发现h1(host1)与h3是不互通的。
在odl中的拓扑图如下:三个被odl纳管的交换机
openflow:2节点的端口详情如下:
重点关注s2-eth1端口,该交换机端口连接host1主机。
openflow:3节点的端口详情如下:
重点关注s3-eth1端口,该交换机端口连接host3主机。
2.创建VTN网络vtn1:
curl --user "admin":"admin" -H "Content-type: application/json" -X POST http://192.168.26.124:8181/restconf/operations/vtn:update-vtn -d '{"input":{"tenant-name":"vtn1"}}'
#tenant-name:vtn网络名; input中还可以携带其他参数,详见创建vtn网络参数解析
3.创建虚拟桥vbr1
curl --user "admin":"admin" -H "Content-type: application/json" -X POST http://192.168.26.124:8181/restconf/operations/vtn-vbridge:update-vbridge -d '{"input":{"tenant-name":"vtn1", "bridge-name":"vbr1"}}'
# bridge-name:虚拟桥名,这里需要注意一点,一个vtn网络可以创建多个虚拟桥;input中还可以携带其他参数,详见创建虚拟网桥参数解析
4.创建虚拟接口
在虚拟桥上创建两个虚拟接口if1和if2
curl --user "admin":"admin" -H "Content-type: application/json" -X POST http://192.168.26.124:8181/restconf/operations/vtn-vinterface:update-vinterface -d '{"input":{"tenant-name":"vtn1", "bridge-name":"vbr1", "interface-name":"if1"}}'
curl --user "admin":"admin" -H "Content-type: application/json" -X POST http://192.168.26.124:8181/restconf/operations/vtn-vinterface:update-vinterface -d '{"input":{"tenant-name":"vtn1", "bridge-name":"vbr1", "interface-name":"if1"}}'
#interface-name:虚拟接口名,input中还可以携带其他参数,详见创建虚拟接口参数解析
5.进行map映射
将创建的虚拟接口和交换机端口(与host主机相连的端口)进行映射
curl --user "admin":"admin" -H "Content-type: application/json" -X POST http://192.168.26.124:8181/restconf/operations/vtn-port-map:set-port-map -d '{"input":{"tenant-name":"vtn1", "bridge-name":"vbr1", "interface-name":"if1", "node":"openflow:2", "port-name":"s2-eth1"}}'
curl --user "admin":"admin" -H "Content-type: application/json" -X POST http://192.168.26.124:8181/restconf/operations/vtn-port-map:set-port-map -d '{"input":{"tenant-name":"vtn1", "bridge-name":"vbr1", "interface-name":"if1", "node":"openflow:2", "port-name":"s2-eth1"}}'
#node 和port-name 定位了一个交换机端口,input中还可以携带其他参数,详见:set_port_map参数解析
验证结果: h1可以ping通s3
该功能部分api 总结:
创建vtn:
curl --user "admin":"admin" -H "Content-type: application/json" -X POST http://localhost:8181/restconf/operations/vtn:update-vtn -d '{"input":{"tenant-name":"vtn1"}}'
删除vtn:
curl --user "admin":"admin" -H "Content-type: application/json" -X POST http://localhost:8181/restconf/operations/vtn:remove-vtn -d '{"input":{"tenant-name":"vtn1"}}'
创建虚拟桥:
curl --user "admin":"admin" -H "Content-type: application/json" -X POST http://localhost:8181/restconf/operations/vtn-vbridge:update-vbridge -d '{"input":{"tenant-name":"vtn1", "bridge-name":"vbr1"}}
删除虚拟桥:
curl --user "admin":"admin" -H "Content-type: application/json" -X POST http://localhost:8181/restconf/operations/vtn-vbridge:remove-vbridge -d '{"input":{"tenant-name":"vtn1", "bridge-name":"vbr1"}}
创建虚拟接口:
curl --user "admin":"admin" -H "Content-type: application/json" -X POST http://localhost:8181/restconf/operations/vtn-vinterface:update-vinterface -d '{"input":{"tenant-name":"vtn1", "bridge-name":"vbr1", "interface-name":"if1"}}'
删除虚拟接口:
curl --user "admin":"admin" -H "Content-type: application/json" -X POST http://localhost:8181/restconf/operations/vtn-vinterface:remove-vinterface -d '{"input":{"tenant-name":"vtn1", "bridge-name":"vbr1", "interface-name":"if1"}}'
创建port map:
curl --user "admin":"admin" -H "Content-type: application/json" -X POST http://localhost:8181/restconf/operations/vtn-port-map:set-port-map -d '{"input":{"tenant-name":"vtn1", "bridge-name":"vbr1", "interface-name":"if1", "node":"openflow:2", "port-name":"s2-eth1"}}'
删除port map:
curl --user "admin":"admin" -H "Content-type: application/json" -X POST http://localhost:8181/restconf/operations/vtn-port-map:remove-port-map -d '{"input":{"tenant-name":"vtn1", "bridge-name":"vbr1", "interface-name":"if1"}}'
注意:该功能在硼版本实现,并未在其他版本测试。