声明:

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

作者:林凯

团队:华为杭州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#敏感关键词过滤代码

    System.Text.StringBuilder sb = new System.Text.StringBuilder(text.Length);             string filter ...

  2. 学习日记_SSH框架web.xml配置文件篇

    1.参考一:http://www.blogjava.net/yxhxj2006/archive/2012/07/09/382632.html 2.参考二: <!-- web 容器启动spring ...

  3. 微信 token 验证

    package org.sxl.weixin; import java.security.MessageDigest; import java.security.NoSuchAlgorithmExce ...

  4. CSS 布局Float 【2】

    1.页面标准文档流.浮动层.float属性 1.1 文档流 HTML页面的标准文档流(默认布局)是:从上到下,从左到右,遇块(块级元素)换行. 1.2 浮动层 浮动层:给元素的float属性赋值后,就 ...

  5. Hibernate中session的产生的方式

     *  session的产生的方式      * 1. sessionFactory.openSession         每次都会新创建一个session,只要新创建一个session,hiber ...

  6. 如何使一个你没有源代码的DLL文件变为强命名的DLL

    转载: 有时候你会需要一个DLL是强命名的,比如你想把这个文件放到GAC里面.如果这是一个第三方的DLL,你没有源代码,这会是一件比较麻烦的事情.有一个方法可以解决这个问题. 在VS.NET的命名行窗 ...

  7. Dede 查询附加表

    <!--使用dede:arclist取出信息 dede_archives 表 $sql="Select 字段 from dede_archivies",但是在默认情况下 de ...

  8. HTTP协议学习-02

    HTTP 协议详解之 URL 的组成 http(超文本传输协议)是一个基于请求与响应模式的.无状态的.应用层的协议,常基于 TCP 的连接方式,HTTP1.1 版本中给出一种持续连接的机制,绝大多数的 ...

  9. python百科

    Python 编辑词条 添加义项名 B 添加义项 ? Python(英语发音:/ˈpaɪθən/), 是一种面向对象.解释型计算机程序设计语言,由Guido van Rossum于1989年底发明,第 ...

  10. (推荐)jquery.pagination.js分页

    序言 本来想自己对这个分页使用做一些总结的,但发现大神们已经总结的很好了.所以给推荐一下. 转自:http://www.cnblogs.com/knowledgesea/archive/2013/01 ...