OVN实战二之Overlay实现

邢森:Java、Python码农,运营“写程序的康德”自媒体。现就职于上海电信信息网络部任职架构师,主要负责网络相关产品的研发工作。

前言

上一章介绍了GNS3的使用以及OVN系统的架构,搭建了实验环境,阐述了OVN各个进程的用途、彼此之间的关系,以及产生的日志(OVN实战一之GNS3操作指南及OVN入门,https://www.sdnlab.com/19765.html)。本章主要介绍我们实验的拓扑结构,然后实现拓扑中的相应功能。

一、实验环境

1.1 拓扑结构


上面拓扑中有四个“虚拟机(VM)”,分别属于两个广播域(二层交换机,SW),SW1和SW2通过R1连接起来。本章先实现SW1和SW2两个网络。

为了验证实验网络的Overlay功能(VXLAN封包、解包),这里故意把VM1和VM2分配到不同的物理机上,物理上的分布如下:


VM1、VM3运行在ovn-node2上;VM2、VM4运行在ovn-node3上。

1.2 准备虚拟机

笔者的实验资源有限,所以就不通过Hypervisor来创建虚拟机而是通过Linux network namespace模拟虚拟机。

Linux network namespace是Linux从2.6.24开始提供的一种“隔离技术”,它允许一个Linux内核可以拥有多个隔离的网络空间(独立的ARP表、路由表、IP地址、接口)。通过下面命令分别在ovn-node2、ovn-node3上创建VM1和VM2:

在ovn-node2上执行创建虚拟机VM1:

为了便于测试此处使用固定MAC地址

在ovn-node3上执行创建虚拟机VM2:

我们用VETH来模拟模拟虚拟机的网卡,这是Linux提供的一种虚拟网络设备,它通常成对出现,送到一端请求发送的数据总是从另一端以请求接受的形式出现。我们一般把VETH的一端用于连接网桥,一段放入到net namespace中作为网卡。用同样的命令上创建VM3、VM4。

1.3创建SW1搭建拓扑

OVN的所有操作都在ovn-central节点完成,当需要操作网络拓扑中的“虚拟机”的时候我们才会用到ovn-host节点。OVN提供了两个命令行工具叫ovn-sbctl、ovn-nbctl,根据名字不难想到,ovn-sbctl是用来操作SB的;ovn-nbctl是用来操作NB的。逻辑交换机、逻辑路由器是放在NB中的所以和我们经常打交道的是ovn-nbctl。

在ovn-node1上执行:

ls-add命令用于添加逻辑交换机,lsp-add命令用于为逻辑交换机添加端口,在OVN中每个逻辑交换机都有一个唯一的命名。lsp-set-addresses为逻辑交换机端口配置MAC地址和IP地址,这一步骤是不可省略的,OVN会根据这两个信息生成流表
上述命令通过ovn-nbctl工具在NB中添加了一个逻辑交换机、两个逻辑交换机端口;ovn-northd进程会“发现”这个改变,然后读取NB中的数据把它转换成流表写入到SB数据库中(可以通过ovn-sbctl list Logical_Flow查看相关流表)。但是此时流表并没有下发到ovn-host中,需要通过下面命令建立逻辑交换机端口和OVS端口(ovn-host上的OVS)的关联。

在ovn-node2上执行

设置IP地址,必须和lsp-set-addresses 中的一致

在ovn-node3上执行

二、验证结果

在node2上执行ping命令发送ICMP数据包;在GNS3中右击ovn-node2到SW1之间的链路选择“start capture”,GNS3会自动启动Wireshark抓取这段链路上的数据包。
ping命令正常执行,说明vm1和vm2之间可以互相通讯


Wireshark抓取的数据包显示,网络中传送的数据包是VxLAN封装后的Overlay数据包(VNI是1)

注意,Wireshark并没有抓到vm1和vm2之间的ARP数据包,这是OVN的一个特性叫“ARP Responder”,它的实现原理在调试部分说明。

2.1 调试

OVS提供了一个叫ofproto/trace的流表分析工具,用于分析数据包在流表中如何被“处理”。

在ovn-node2上执行

in_port指定数据包从哪个端口进来的,可以通过sudo ovs-ofctl dump-ports-desc br-int查看veth-vm1对应的port编号,在我的环境中它是3。
icmp指定了数据包类型
nw_src源IP地址
nw_dst是目标IP地址
dl_src是源MAC地址
dl_dst是目标MAC地址。


完整的输出太长,这里截取最后一部分,数据包最终被设置上tun_id=1从port2中发送出去。
通过sudo ovs-dpctl show可以查看DataPath和Port的对应关系,port 2对应的是vxlan_sys_xxxx,它是一种特殊的ovs port用于VXLAN的封包。

下面看一下ARP数据包是如何处理的

ovn-node2上执行

arp_tpa是目标IP地址
arp_op是ARP数据包类型,1表示request数据包,2表示reply数据包


ARP数据并没有被发送到到ovn-node3而直接在ovn-node2就终结了,流表自动构造了一个ARP Reply数据包回送到来源端口,这个特性就叫ARP Responder。

创建SW2

SW2的创建过程和SW1很像,此处直接罗列命令:

在ovn-node1上执行

在ovn-node2上执行

在ovn-node3上执行

验证WWW服务

这组环境用于验证TCP服务是否能正常工作,笔者在vm4上启动一个WWW服务,在vm3上通过curl访问。

在ovn-node3上执行

在ovn-node2上执行

执行结果如下图所示,说明WWW服务正常工作

创建R1

在ovn-node1上执行

此处的IP地址相当于路由表,输入格式是CIRD

由于Linux namespace没有默认网关,所以需要为vm1、vm2、vm3、vm4配置默认网关

ovn-node2

ovn-node3

通过vm1访问vm4的WWW服务,说明R1已经生效。

参考资料

OVS每个字段的说明,流表的语法规则 http://openvswitch.org/support/dist-docs/ovs-ofctl.8.html
NB数据库结构 http://openvswitch.org/support/dist-docs/ovn-nb.5.html
SB数据库结构 http://openvswitch.org/support/dist-docs/ovn-sb.5.html


  • 本站原创文章仅代表作者观点,不代表SDNLAB立场。所有原创内容版权均属SDNLAB,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用,转载须注明来自 SDNLAB并附上本文链接。 本站中所有编译类文章仅用于学习和交流目的,编译工作遵照 CC 协议,如果有侵犯到您权益的地方,请及时联系我们。
  • 本文链接https://www.sdnlab.com/19802.html
分享到:
相关文章
条评论

登录后才可以评论

fireflyc 发表于17-09-01
1