一、总述
前两次已经完成了docker镜像的生成以及OVS和docker之间的连接,本次完成ODL与OVS的连接,最终可以在ODL看到拓扑。
主要参考的文章如下:
实现两个ovs交换机相连_ovs-vsctl set interface-CSDN博客
二、下载并安装ODL,打开ODL
这个在CSDN上教程很多,挑选一个就行。
需要注意运行ODL(在/bin下运行/karaf后),在浏览器打开的网站的ip,使用ifconfig查看,一般是196.xxxx这样的,不应该是127.0.0.1这个地址,这个地址也可以打开ODL并且查看交换机,但是后续在拓扑里不显示主机,目前我还不知道原因。
三、连接ODL和OVS交换机
1.设置协议版本
ovs-vsctl set bridge (OVS的网桥名) protocols=OpenFlow13
2.连接网桥
ovs-vsctl set-controller (OVS的网桥名) tcp:(你的ip地址):6633
此时我们就可以在ODL的topology页面看到交换机,但是无法看到相连的主机。
Nodes页面可以看到交换机及其相连的端口。
此时我们ping不通原来可以ping通的两台docker主机了,这是因为没有下发流表的缘故。
3.下发流表
形如
ovs-ofctl add-flow br0 priority=12,in_port=1,actions=output:2
- br0:OVS的网桥名
- priority:优先级,优先级越高越先传输
- in_port:进口,这里的进出的1和2口应该在ODL的Nodes页面查看端口号具体是多少,比如我设置时的两个端口就分别是6和7
需要注意三点:
- 如果在前面设置了协议版本,在命令的结尾都要添加
-O openflow13
不然会报错
- 如果想让两个主机导通,应该下发两条流表,比如
ovs-ofctl add-flow br0 priority=12,in_port=1,actions=output:2 ovs-ofctl add-flow br0 priority=12,in_port=2,actions=output:1
- 如果下发的流表,比如进口为1,但是出口有2和3,不可以一条一条的下发流表,他们会覆盖。比如
#错误示范
ovs-ofctl add-flow br0 priority=12,in_port=1,actions=output:2
ovs-ofctl add-flow br0 priority=12,in_port=1,actions=output:3
#正确示范
ovs-ofctl add-flow br0 priority=12,in_port=1,actions=output:2,3
4.ping主机
此时两台docker主机之间就可以ping通了,并且ping通之后在拓扑页面就可以显示主机了。如果需要连接多台OVS交换机,请参考我上面列出的第一篇文章,再重复一遍下面的步骤。