前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ovs小tag实现OpenStack大网络

ovs小tag实现OpenStack大网络

作者头像
SDNLAB
发布2020-05-13 19:14:25
1.6K0
发布2020-05-13 19:14:25
举报
文章被收录于专栏:SDNLABSDNLAB

局域网游戏代表:红色警戒

ovs软件交换机可以基于端口tag号实现vlan的隔离,功能上类似于物理交换机的vlan隔离。而tag号在openstack的各种网络发挥着十分重要的作用,几乎所有的openstack网络都离不开tag号。本文从ovs交换机中tag的作用讲起,解析openstack中各种网络是如何使用tag号,以小见大,剖析原理。

下面首先使用mininet仿真软件创建一个最简单的拓扑,然后设置端口tag来实现vlan。

Mininet创建简单拓扑

mininet是SDN学习中用来创建各种拓扑的仿真软件,能够使用最小的消耗完成主机,交换机,控制器的模拟。使用mn命令创建两个主机连接到一个交换机中的拓扑。

查看交换机的端口。两个主机连接到交换机的两个端口,分别是s1-eth2,s1-eth2。所有的端口默认其实都是有tag的,tag为0,但不会显示在这里。

打开h1

mininet 仿真器可以打开任何一个模拟出来的设备,可以将新开的端口看做一个虚拟机。

主机h1这时还不能和主机h2通信,因为ovs交换机中没有任何流表。

下发正常转发流表

sh ovs-ofctl add-flow s1 action=normal

action=NORMAL的流表意思是该交换机配置成一个正常传统交换机工作。ovs交换机有两种工作模式:SDN模式和传统模式。传统的ovs交换机是通过mac地址自学习来完成数据帧交换,SDN模式是交换机里的流表匹配数据流然后有相应的转发动作。这里就是让交换机实现mac地址自学习功能。

主机1能够ping通主机2

查看mac地址自学习表,可以看到这个时候交换机的端口,特别是VALN都是0。

设置tag号

tag是在端口上设置的,使用命令将tag号打在端口上。

ovs-vsctl set Port s1-eth1 tag=100

ovs-vsctl set Port s1-eth2 tag=200

再次让h1 ping h2 可以发现已经无法通信了。

查看交换机的mac地址自学习表,能够看到VLAN发生了变化。正是这种VLAN的变化导致主机之前网络不通

ovs-dpctl:可以统计每条 datapath 上的设备通过的流量,打印流的信息。datapath模块是最底层交换机机制的实现,功能是接收网包-查表-执行action。下面使用dpctl查看经过datapath数据流是怎么样

ovs-dpctl dump-dps

可以看到在h1 h2互相ping时的数据流。

这两条经过的数据流分别是h2和h1发出的。其中action表明了该条流vlan的产生过程。数据帧进入s1是不带vlan的,因为ovs是软件模拟,所以datapath负责对设置了tag的端口在数据帧中加入tag(个人理解)。从h2出来的数据帧进入datapath打上vlan tag200,从h1出来的数据帧进入datapath打上vlan tag100。因为数据流的tag导致了匹配之后无法转发。

注意:这里的in_port并不是网桥s1上的port,而是datapath自己的的port,关系可以参考如下:

tag在openstack中使用

openstack有多种网络插件,其中最重要的就是ovs,即openvswitch-plugin。在使用ovs实现openstack中的各种网络时,这里各种网络指:local,flat,vlan,vxlan等,tag标签的使用可以说是每一种网络都离不开的。下面分别解析各种网络中tag标签的使用。部分截图来自cloudman的《每天五分钟玩转openstack系列》。

local网络

local网络是虚拟机的网络和网桥连接,但是网桥和服务器网卡之间没有连接。流量限制在网桥内部。在local网络中,为了实现网络隔离,不同网络之间连接到网桥的tag是不一样的。在同一个tag下的网络可以互相通信,当然网络是访问不到外网的,这是local网络的最大特征。

flat网络

flat网络叫平面网络即为不带tag的网络。不带也是一种特征。flat网络模式下,每创建一个网络,就需要独占一块网卡,所以一般也不会使用这种网络作为租户网络。虽然说flat网络不带tag,但是其实是所有的port都使用了默认的tag号1,所以能够看到网桥中port都有tag为1。

vlan网络

vlan网络是tag在openstack中的一个重要应用,值得重点讲解。

vlan网络的模型如下:

在vlan网络中。每一个网络在br-int上的tag号都是不一样的,比如使用网络1创建的虚拟机,其port的tag是1,使用网络2创建的虚拟机,其port的tag是2。有了不同的tag就能够实现了vlan隔离。如下图:

但是只使用tag隔离不同网络还不算完成vlan网络。因为如果同一个网络下的两个虚拟机调度到不同的节点,那么流量要经过一个节点到另一个节点肯定要经过物理交换机。并且前面说过tag号就是vlan id。在br-int上定义的tag号不会考虑物理交换机上的vlan id是否支持。通俗来说就是ovs是虚拟交换机,tag号自己管理,而物理交换机的vlan id是物理交换机管理。这两个vlan是不同设备的,所有不能保证可以直接通用。万一ovs定义的vlan超过物理交换机最大值,而物理交换机不能识别呢?所以在br-ethx这个网桥上需要对ovs的vlan和物理交换机的vlan做一个转换。规则也很简单:

在br-ethx上对来自br-int 的数据,将vlan 1转化成物理网卡能通过的vlan 100

在br-int上对来自br-ethx的数据,将vlan 100转成ovs交换机能通过的vlan 1。

br-int上流表:

#ovs-ofctl dump-flows br-int

br-ethx上流表:

#ovs-ofctl dump-flows br-eth0

vxlan网络

vxlan网络看似比较复杂,其实如果能够理解vlan网络的ovs tag和物理vlan id转换原理就好理解。vxlan数据构造比较特殊,其数据结构如下:

在正常的网络封装上还有外层,并且重要的是中间还有一个vxlan头。重点就在这个vxlan的头,vxlan头部中有一个tunnel id。不同的vxlan网络之间使用tunnel id来隔离。ovs实现的vxlan结构如下:

创建虚拟机之后,在br-int上的port会有tag号。不同的网络之间tag号是不一样的。那么分情况讨论:

如果同一网络的虚拟机都在一个计算节点,同一个br-int上,它们之间的tag是一样的,所以直接通过br-int转发数据。不同网络之间tag不同,br-int根据tag实现隔离。

如果同一网络的虚拟机分布在不同的计算节点上,这时就需要通过bt-tun这个网桥发送出去。在br-tun上维护了一个vlan和vxlan之间的转换关系。比如对于计算节点1来说:vlan 4 对应了 vxlan 256。这时bt-tun就会把vlan 为4 的数据经过vxlan封装,封装成vxlan 256的数据包,然后发送出。同样当br-tun接收到数据包时,会将vxlan转化成vlan,然后发送到br-int,br-int 根据不同的vlan转发到对应虚拟机。

将vlan转化成vxlan

将vxlan 转化成vlan

刚好这两条处理是相互的,可以清晰看出vlan和vxlan之间的转换。

最后这里有一个有意思的东西,前面说过vxlan网络下,使用tunnel id 隔离。在不同的计算节点上发现 相同的tunnel id 0x222 对应的vlan 是不一样的?为什么会这样?

同一个tunnel 在不同节点的对应的tag号不一样,那不同节点上的虚拟机之间vlan不同能够正常访问吗?毫无疑问是可以的,为啥呢?因为在出服务器时br-tun已经将tag剥离,到了相应的服务器时会加上该tunnel id在该服务器上的对应的tag号。每一个服务器上tunnel id对应的tag都是不一样的,但是只要tunnel id一致就能走遍天下。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 SDNLAB 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档