下面是部分源自我客座期间的调研报告,本作品采用知识共享Attribution-NonCommercial-NoDerivatives 4.0 国际许可协议进行许可,转载前请先联系作者(MatheMatrix)。

下面我们以这样一个场景来解释Open vSwitch如何在Neutron(OpenStack发挥作用),假定读者实践过前文第二章“Neutron与其他OpenStack模块安装 ”(暂未公开~不过基本类似于前边的OpenStack 安装脚本与常见问题),或对OpenStack有一定认识,最好实践过官方OpenStack安装手册的内容。

场景(一个租户,两个网络,一个路由,内部网络使用GRE,Libvirt VIF Driver使用LibvirtHybridOVSBridgeDriver):

场景一虚拟网络拓扑

场景一虚拟网络拓扑

Figure 11 场景一虚拟网络拓扑

如图我们有一个外网(External Network),IP段为172.16.0.0/16,两个内网,分别是Internal:10.18.0.0/24,和Internal2:10.22.22.0/24,值得注意的是这是两个网络(network),而不是子网(subnet)。

在这个场景下,计算节点的内部应当是这样的:

 

计算节点网络连接原理

计算节点网络连接原理

下面我将解释如何得到这幅图。首先我们看下我们的虚拟机在libvirt的名称,通过 nova show 命令我们大概可以获得像这样输出(截取前半部分):

我们看到这台虚拟机被部署在compute1节点上,instance_name为instance-0000001e,我们上compute1节点使用virsh dumpxml将instance-0000001e的信息打印出来(截取网络相关):

在这里我们看到这台虚拟机的网络设备是tap48e06cd2-60,而且似乎连到了qbr48e06cd2-60上,让我们用brctl show再看下(截取相关部分):

看到这里网桥qbr48e06cd2-60上接了两个接口,qvb48e06cd2-60和tap48e06cd2-60,其中的tap设备是我们虚拟机使用的虚拟网络设备,那qvb48e06cd2-60是什么?我们先用lshw –class network把所有网络设备打印出来(截取相关部分):

我们注意到这里显示这个设备的driver是veth,而veth总是成对出现的,我们用ethtool -S 看下这个veth的另一端连到了那里:

OK,看下16号是哪个设备,ip link(截取相关部分):

通过上面两个步骤我们已经知道了这对从虚拟机的网络设备到veth pair这个流程,这个过程在官方文档中针对不同的 Libvirt VIF Driver有不同的简单的描述,见https://wiki.openstack.org/wiki/LibvirtVIFDrivers

下面应该是连到Open vSwitch上吧,让我们验证下:

果然qvo48e06cd2-60是连到了br-int上, OpenStack采用这么复杂的机制,而不是把tap设备直接连到Open vSwitch上,这与安全组有关,将在3.2.4基于iptables的Security Group介绍。

在研究到OVS内部前,我们先注意下在poty “qvo48e06cd2-60”下有一个“tag: 1”,这个tag是Open vSwitch用来区分不同子网的。在这里,tag1表示我们的10.18.0.0/24子网,tag2表示10.22.22.0/24子网。

br-int和br-tun通过patch连接,在官方文档上patch的介绍并不多,但一旦两个OVS网桥通过网桥连接,这两个网桥将近乎为同一个网桥,参考资料见:Open vSwitch FAQConnecting OVS Bridges with Patch Ports

首先看下bt-int的流表规则:

只有一个NORMAL的动作,在Open vSwitch的官方文档里解释为将包以传统的,非OpenFlow的方式进行交换,也就是说效果和没设置OpenFlow规则一样(见Open vSwitch Advanced Features Tutorial)。那么我们分析br-tun的流表规则,首先在计算节点上用ovs-ofctl dump-ports-desc查看br-tun上所有接口:

然后用ovs-ofctl dump-flows或者EasyOVS查看br-tun的流表规则(这里使用EasyOVS使排版相对好看):

这里为了好看只显示了ID、表名、计数器、匹配规则和行为。先看这几条流:0、3、4、9、10、11、12,这些流定义了从br-int进入的包的行为,逐条从上往下看:

再看1、6、7、5,这几个流定义了来自GRE通道(Network节点)的包的行为:

至此,计算节点的网络分析已经基本完成。后面到网络节点的连接等主要涉及到3层路由,暂且不表。

30 Thoughts on “OpenStack计算节点上虚拟网络(Neutron)详解

  1. 每次看到你写的东西,我就忍不住感叹是学海无涯,隔行如隔山

    • 恩 主要是隔行如隔山,话说想起来一句话『吾生也有涯,而知也无涯』,不过很多人不知道下半句是『以有涯随无涯,殆已!』:-)

    • 对了 问一下 你那种在其他wordpress都能显示头像是怎么弄的?

      还有怎么称呼? Matrix君?

      • 哎 还是专业不同嘛……

        头像应该是 WordPress 自动支持的吧,来自 Gravatar 的头像,在后台的“设置”,“讨论设置”,里有头像的设置:

        “头像

        ”头像是您在各个博客见通用的图像。在每个启用了头像功能的站点上,它将显示在您的名字旁边。在这里您可以启用您站点上的读者评论头像显示功能。

        ”头像显示: 显示头像

        ”最高等级: G —— 适合任何年龄的访客查看
        PG —— 可能有争议的头像,只适合13岁以上读者查看
        R —— 成人级,只适合17岁以上成人查看
        X —— 最高等级,不适合大多数人查看

        ”默认头像:
        ”……”

        具体搜下”WordPress Gravatar”即可

  2. 话说你写的这些东西都用于哪里?
    是商业用途吗?

    • 之前写调研报告是给老板看得,说明自己这段时间在干什么…… 自己补充下,改改发到网上是为了分享 :-),自己在学习中借鉴研究了不少别人发在网上的文章,现在也反哺回网络~ :-)

  3. 你是做什么个工作的呀

  4. “将在3.2.4基于iptables的Security Group介绍”。
    没找着呢。。。

  5. 小伙子,你这个是抄的,原文在青云上

    • 你说的 UnsitedStack 上的 UOS 中的虚拟网络设备 https://www.ustack.com/blog/virtual-device-in-uos/ 这篇吧,你仔细看下发表时间,UStack 那篇就是我修改之后投上去的 :)

      • 纳尼???
        大虾,有几个问题想请教一下
        openstack如何保证运行在vm下应用的稳定性?
        cinder和swift存储区别
        openstack vm支持热备么?
        neutron可否做负载均衡?

        =。=!~
        不胜感激

        • 简单说一下吧,上班时间 :-)

          应用的稳定性只能靠客户,系统只能保证负载或某些监控指标有问题时自动扩展或者加机器,过几天我会在 UStack 上再写一篇相关的文章,写完我发给你看下帮我review :-)

          cinder 是快存储,swift 是面向对象存储,网上文章挺多的,你可以搜一下,因为我对存储了解也不深

          vm 的热设备指哪些?这个依赖于 hypervisour,比如你用 VMware、kvm 什么的当然结果不同,不过一些“虚拟设备”是肯定没问题的,比”虚拟网卡”,因为它并没有真正“插入”到虚拟机上

          热备可以说是 snapshot 吧,可以的,但不一定有热备想的那么好用

          负载均衡社区有LBaaS,主要以来haproxy,差不多能用

  6. 文章质量很高,赞一个。另外,请问“场景一虚拟网络拓扑”是用什么软件画的,可以分享一下吗?

  7. 大神,能否帮忙解决下这个问题:http://www.zhihu.com/question/26473334?guide=1,这里贴不了图,劳烦您看下,十分紧急

  8. 这篇文章 Code block 需要修复一下

  9. Pingback: openstack 网络架构 nova-network + neutron | 58同城技术团队 Edit

  10. 博主,请教一个问题,neutron的vlan模式有vlan范围的限制,而网上说使用gre和vxlan等隧道技术可以突破这个限制。而在neutron的gre模式中,br-int还是使用的vlan,只是在br-tun中做了一个vlan id和隧道 id的转换,那么br-int的vlan号还是有这个限制,也就是说能创建的私有网络个数还是有限制的。那么gre是如何突破这个限制的?

    • br-int 里用 vlan 一般认为是没问题的,因为 br-int 是只针对本机的,出去的时候会映射称 nvgre 或者 vxlan 的 id 嘛,所以一个计算节点上能放 4000 个网络的虚拟机,足够用了吧 :-)

      • 是这样的吗?假如我有两个计算节点,租户一共定义了4000个网络(假设vlan最大为4000),每一个网络起了两台虚拟机,而同一个网络的两台虚拟机正好分在了两个不同的计算节点上,那么这两台计算节点上的br-int上都有4000个不同的vlan id,但是整个openstack还是只能有4000个网络啊!
        也就是说一个计算节点上能放4000个网络的虚拟机是没错,但是同一个网络的虚拟机不一定都放在同一个计算节点上啊。

  11. Pingback: openstack 网络架构 nova-network + neutron – 可可云计算网 Edit

  12. Pingback: openstack网络架构 | 北半球的天空 Edit

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

你可以管理本篇文章的订阅。

Post Navigation