声明:

本博客欢迎转载,但请保留原作者信息!

作者:林凯

团队:华为杭州OpenStack团队

OpenStack Juno版本号已正式公布,这是这个开源云平台的10个版本号,在Juno版的Neutron模块中真正引入了分布式路由(DVR)的实现,如今就让我们来初步看下分布式路由是怎么样工作的。

分布式路由怎么工作?

为了实现分布式路由。L3和L2 agent将须要工作在计算节点内。

今天。L3 agent执行在网络节点。但DVR提议,L3agent会在计算节点上执行。L2 agent将继续工作在计算节点,而将工作在所谓的“DVR模式',当中L2 agent将另外负责管理(加入/删除)一个增强模式OVS规则以实现分布式路由。

以下来说明怎样分布式路由完毕的拓扑实例:

在上图,一个PING请求从红色网络上的VM1中发送到在绿色网络上的VM2,这两个网络之间通过一个分布式路由器r1连接。

r1在CN1和CN2节点上有同样的IP地址和MAC地址。

我们能够看到,分布式路由器r1有两个接口,一个接口在红色网络的子网上,还有一个在绿色网络的子网上。

从VM1到VM2的PING ECHO请求数据流能够从上图1到6数据流看出。

1.从vm1中发出带有vm2 ip目的IP的数据流,首先发往红色网络的默认网关mac即r1上红色子网的接口的MAC地址(r1-red-mac),整合网桥发送这些这个数据流给r1

2.DVR路由器r1的红色子网接口接受这个数据帧,然后路由这个数据帧。

3.路由之后。r1将这个数据帧发送到绿色子网的接口,这个数据帧被br-int交换到br-tun。而且打上绿色网络的本地vlantag。

4.在CN1的br-tun用他节点上唯一的DVR mac地址取代帧的源mac地址(一个唯一的dvr mac地址被控制器分配给每一个计算节点CN1和CN2是不一样的)。更改后的数据帧通过br-tun发送到CN2,在发送前他也去除了本地绿色vlantag,并打上隧道vni vxlan id。

5.CN2上br-tun收到这个隧道数据帧。去除绿色vni标签。然后加上本地绿色网络vlan tag,然后发送这个帧到br-int。

6.CN2上的br-int识别到数据帧的源mac地址是一个独特的DVR mac地址(每一个计算节点的l2-agent知道全部dvr独有的mac地址)。之后将这个mac地址替换成绿色子网的mac地址,然后发送这个数据帧给vm2.

从vm2发送ping response给vm1,和上述的过程是一样的。

正如你可能已经注意到。在帧的源节点的DVR路由路由这些数据帧,他们仅仅是被发送到正确的目的地。对于全部的路由的帧。帧的源节点的DVR唯一的MAC地址被用在底层,作为该帧的源MAC地址(即内部帧)。

VM2的ARP表项将被预填充在CN1上的DVR路由器R1。由CN1上的L3-agent执行(通过从L3的插件提供的信息)。相同,对于VM1的ARP表项将由CN1上的L3-agent执行(通过从L3的插件提供的信息)预填充在CN2上的DVR的路由器R1。

CN1上流规则

br-int的规则:

br-tun的规则

CN2上的流规则:

br-int的规则:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2FueGluZ2hlbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

br-tun的规则:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2FueGluZ2hlbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

当执行在DVR模式下。全部这些红色表示的表和规则都是新增的,将通过二级代理进行额外的管理。

这些规则的简明说明例如以下:

a.通过租户的虚拟机生成的ARP广播请求在云广播到全部其它CN。可是,假设是ARP请求帧的目标是默认网关的IP(路由器IP子网)。那么这种帧被本地的br-tun所丢弃。由于这种ARP须要。并将仅仅被本地有效的DVR实例所服务。

Tunnel bridge

DVR PROCESS Table 1 (New table for dvr):

table=1, priority=4, dl_vlan= red1-L-vlan, dl_type=arp,ar_tpa= r1-red-ip actions: drop

table=1, priority=4, dl_vlan= grn1-L-vlan, dl_type=arp,ar_tpa= r1-grn-ip actions: drop

b.由分布式路由器接口port产生的全部请求,无论是ARP请求时,其他广播(或)单播数据包。将被发送至云中。可是,全部的这些帧被觉得是“DVR路由帧”。因此这种帧将搭载在该帧的源MAC地址的“本地唯一的DVRMACADDRESS”被转发到云中。

将本地的路由接口的mac地址转换为本地唯一的dvr mac address在 DVR PROCESStable完毕,例如以下演示样例:

Tunnel bridge

DVR PROCESS Table 1 (New table for dvr):

table=1, priority=1, dl_vlan=red2_L_vlan,dl_src=r1-red-mac, actions: mod_dl_src=dvr-cn1-mac, resubmit(,2)

table=1, priority=1, dl_vlan=grn2_L_vlan,dl_src=r1-grn-mac, actions: mod_dl_src=dvr-cn1-mac, resubmit (,2)

c.补充b点,在DVR的路由通过计算节点接收到的帧,目的节点上的br-int将去除上面加入的“唯一的DVR的MAC地址”。相同,br-int将代替本地DVR实样例网接口的MAC地址,再把该帧转发到本地目的地的虚拟机。这是通过br-int中的新的表1完毕。比如在CN2:

Integration Bridge Rules

Table 0: (Local switching table)、

table=0, priority=2, in_port=patch-tun, dl_src=dvr-cn1-macactions: goto table 1

table=0, priority=1, actions: output->NORMAL Table 1:(DVR_TO_LOCALMAC table)

table=1, priority=2, dl_vlan=grn2-L-vlan,nw_dst=grn-subnet actions: strip_vlan,mod_dl_src=r1-grn-MAC,output->port-vm2

table=1, priority=1 actions: drop

d.发往本地dvr子网的接口mac地址的数据包在原始计算节点的br-tun中丢弃。由于它们假设转发到云中。将在这个包被云中其它节点解码时。创建mac发生歧义。这是通过以下的规则:

Tunnel bridge

DVR PROCESS Table 1 (New table for dvr):

table=1, priority=2, dl_vlan=red2_L_vlan,dl_dst=r1-red-mac, actions: drop

table=1, priority=2 , dl_vlan=grn2_L_vlan,dl_dst=r1-grn-mac, actions: drop

e.为了防止多个单播的路由数据包同一时候发往云中的全部计算节点的远程虚拟机。12的预填充技术被用来在计算节点预先填充FDB表中。仅仅对正确的单目的地计算节点发送帧。

f.对于br-int上的这些规则,当中一长串的端口都可能会出现“输出口”行动规则。该文件建议使用可从2.1OpenVswitch(OVS)版本号的“组表Group Tables”措施,将源MAC地址改动为qr-net2的MAC地址,并转发到Net2的全部port,VM2就能收到请求包了。

Integration bridge

Table 1: (DVR_TO_LOCALMAC table)

table=1, priority=2, dl_vlan=grn2-L-vlan,nw_dst=grn-subnet actions: strip_vlan,mod_dl_src=r1-grn-MAC,output->port-vm2

OpenStack Neutron DVR L2 Agent的初步解析 (一)的更多相关文章

  1. Openstack Neutron DVR workflow

    目前在Juno版本的trunk中已经合入了DVR相关的代码,我的理解是在Juno版本中DVR是一个experimental feature.最好需要稳定一个版本以后再上生产环境.之前写过一篇博文是DV ...

  2. 初探Openstack Neutron DVR

    目前在Juno版本的trunk中已经合入了DVR相关的代码,我的理解是在Juno版本中DVR是一个experimental feature.最好需要稳定一个版本以后再上生产环境.之前写过一篇博文是DV ...

  3. Openstack Neutron L2 Population

    Why do we need it, whatever it is? VM unicast, multicast and broadcast traffic flow is detailed in m ...

  4. [转]OpenStack Neutron解析

    1.为什么还需要linux bridge的部署方式? 2.哪一个网桥起着交换机的作用? 3.neutron如何实现私有网络的隔离 =================================== ...

  5. [转]OpenStack Neutron运行机制解析概要

    转载自:http://panpei.net.cn/2013/12/04/openstack-neutron-mechanism-introduce/ 自从开学以来,玩OpenStack也已经3个月了, ...

  6. Openstack Neutron:二层技术和实现

    目录 - 二层的实现 - 1.本地联通与隔离: - Linux bridge实现方式: - local - Flat - VLAN - VXLAN - Open vswitch实现方式 - local ...

  7. openstack neutron L3 HA

    作者:Liping Mao  发表于:2014-08-20 版权声明:能够随意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 近期Assaf Muller写了一篇关于Neutro ...

  8. neutron DVR

    DVR 简介 DVR 提出的背景 在 Neutron 的网络环境中,跨子网的虚机通信是需要通过 Neutron 的路由器.这既包括不同子网的虚拟机之间的通信,又包括虚拟机与外网之间的通信.在 DVR ...

  9. openstack——neutron网络服务

    一.neutron 介绍:   Neutron 概述 传统的网络管理方式很大程度上依赖于管理员手工配置和维护各种网络硬件设备:而云环境下的网络已经变得非常复杂,特别是在多租户场景里,用户随时都可能需要 ...

随机推荐

  1. 你好,C++(11)如何用string数据类型表示一串文字?根据初始值自动推断数据类型的auto关键字(C++ 11)

    3.5.2  字符串类型 使用char类型的变量我们可以表示单个字符,那么,我们又该如何表示拥有多个字符的字符串呢? 我们注意到,一个字符串是由多个字符串连起来形成的.很自然地,一种最简单直接的方法就 ...

  2. I/O复用-select模型

    IO复用: I/O复用使得程序可以同时监听多个文件描述符,这对提高程序的性能至关重要.例如TCP服务器要同时处理监听socket和连接socket,客户端要同时处理用户输入和网络连接. Linux下实 ...

  3. [HTML5 Canvas学习]绘制矩形

    1.使用strokeRect和fillRect方法绘制矩形 a.strokeRect是绘制一个不填充的矩形 b.fillRect是绘制一个填充的矩形 代码: <script> var ca ...

  4. localstorage || globalStorage || userData

    globalStorage 这个也是html5中提出来,在浏览器关闭以后,使用globalStorage存储的信息仍能够保留下来,并且存储容量比IE的userdata大得多,一个域下面是5120k.和 ...

  5. css 属性之绝对定位

    <html><head><style type="text/css">h2.pos_abs{position:absolute;left:100 ...

  6. 写给新手看的Flask+uwsgi+Nginx+Ubuntu部署教程

    学习 Flask,写完一个 Flask 应用需要部署的时候,就想着折腾自己的服务器.根据搜索的教程照做,对于原理一知半解,磕磕碰碰,只要运行起来了,谢天谢地然后不再折腾了,到下一次还需要部署时,这样的 ...

  7. 快速排序(Quick Sort)的C语言实现

    快速排序(Quick Sort)的基本思想是通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对着两部分记录继续进行排序,以达到整个序列有序,具体步骤 ...

  8. CodeForces 474B(标记用法)

    CodeForces 474B Time Limit:1000MS Memory Limit:262144KB   64bit IO Format:%I64d & %I64u Descript ...

  9. MySQL的索引

    MySQL索引 索引:是一种特殊的文件(InnoDB 数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针.其可以加快数据读操作,但会使数据写操作变慢:应该构建在被用作查询条 ...

  10. 过多if-else分支的优化

    http://www.udpwork.com/item/9294.html 我想谈一谈这个话题是因为我的上一篇博客在ITEye上有一些朋友回复,说if-else过多的分支可以使用switch或者责任链 ...