原文地址: https://blogs.oracle.com/ronen/entry/diving_into_openstack_network_architecture

译文转载自:http://blog.csdn.net/halcyonbaby/article/details/41524447

前言

openstack网络功能强大同时也相对更复杂。本系列文章通过Oracle OpenStack TechPreview介绍openstack的配置,通过各种场景和例子说明openstack各种不同的网络组件。本文的目的在于提供openstack网络架构的全景图并展示各个模块是如何一起协作的。这对openstack的初学者以及希望理解openstack网络原理的人会非常有帮助。首先,我们先讲解下一些基础并举例说明。

根据最新的icehouse版用户调查,基于open vswitch插件的Neutron在生产环境和POC环境都被广泛使用,所以在这个系列的文章中我们主要分析这种openstack网络的配置。当然,我们知道openstack网络支持很多种配置,尽管neutron+open vswitch是最常用的配置,但是我们从未说它是最好或者最高效的一种方式。Neutron+open vswitch仅仅是一个例子,对任何希望理解openstack网络的人是一个很好的切入点。即使你打算使用其他类型的网络配置比如使用不同的neutron插件或者根本不使用neutron,这篇文章对你理解openstack网络仍是一个很好的开始。

我们在例子中使用的配置是Oracle OpenStack Tech Preview所提供的一种配置。安装它非常简单,并且它是一个很好的参考。在这种配置中,我们在所有服务器上使用eth2作为虚拟机的网络,所有虚拟机流量使用这个网卡。Oracle OpenStack Tech Preview使用VLAN进行L2隔离,进而提供租户和网络隔离,下图展示了我们如何进行配置和部署:

第一篇文章会略长,我们将聚焦于openstack网络的一些基本概念。我们将讨论open vswitch、network namespaces、linux bridge、veth pairs等几个组件。注意这里不打算全面介绍这些组件,只是为了理解openstack网络架构。可以通过网络上的其他资源进一步了解这些组件。

Open vSwitch (OVS)

在Oracle OpenStack Tech Preview中用于连接虚拟机和物理网口(如上例中的eth2),就像上边部署图所示。OVS包含bridages和ports,OVS bridges不同于与linux bridge(使用brctl命令创建)。让我们先看下OVS的结构,使用如下命令:

  1. # ovs-vsctl show
  2. 7ec51567-ab42-49e8-906d-b854309c9edf
  3. Bridge br-int
  4. Port br-int
  5. Interface br-int
  6. type: internal
  7. Port "int-br-eth2"
  8. Interface "int-br-eth2"
  9. Bridge "br-eth2"
  10. Port "br-eth2"
  11. Interface "br-eth2"
  12. type: internal
  13. Port "eth2"
  14. Interface "eth2"
  15. Port "phy-br-eth2"
  16. Interface "phy-br-eth2"
  17. ovs_version: "1.11.0"

我们看到标准的部署在compute node上的OVS,拥有两个网桥,每个有若干相关联的port。上边的例子是在一个没有任何虚拟机的计算节点上。我们可以看到eth2连接到个叫br-eth2的网桥上,我们还看到两个叫“int-br-eth2"和”phy-br-eth2“的port,事实上是一个veth pair,作为虚拟网线连接两个bridages。我们会在后边讨论veth paris。

当我们创建一个虚拟机,br-int网桥上会创建一个port,这个port最终连接到虚拟机(我们会在后边讨论这个连接)。这里是启动一个虚拟机后的OVS结构:

  1. # ovs-vsctl show
  2. efd98c87-dc62-422d-8f73-a68c2a14e73d
  3. Bridge br-int
  4. Port "int-br-eth2"
  5. Interface "int-br-eth2"
  6. Port br-int
  7. Interface br-int
  8. type: internal
  9. Port "qvocb64ea96-9f"
  10. tag: 1
  11. Interface "qvocb64ea96-9f"
  12. Bridge "br-eth2"
  13. Port "phy-br-eth2"
  14. Interface "phy-br-eth2"
  15. Port "br-eth2"
  16. Interface "br-eth2"
  17. type: internal
  18. Port "eth2"
  19. Interface "eth2"
  20. ovs_version: "1.11.0"

”br-int“网桥现在有了一个新的port"qvocb64ea96-9f" 连接VM,并且被标记为vlan1。虚拟机的每个网卡都需要对应在"br-int”网桥上创建一个port。

OVS中另一个有用的命令是dump-flows,以下为例子:

  1. # ovs-ofctl dump-flows br-int
  2. NXST_FLOW reply (xid=0x4):
  3. cookie=0x0, duration=735.544s, table=0, n_packets=70, n_bytes=9976,idle_age=17, priority=3,in_port=1,dl_vlan=1000 actions=mod_vlan_vid:1,NORMAL
  4. cookie=0x0, duration=76679.786s, table=0, n_packets=0, n_bytes=0,idle_age=65534, hard_age=65534, priority=2,in_port=1 actions=drop
  5. cookie=0x0, duration=76681.36s, table=0, n_packets=68, n_bytes=7950,idle_age=17, hard_age=65534, priority=1 actions=NORMAL

如上所述,VM相连的port使用了Vlan tag 1。然后虚拟机网络(eth2)上的port使用tag1000。OVS会修改VM和物理网口间所有package的vlan。在openstack中,OVS agent 控制open vswitch中的flows,用户不需要进行操作。如果你想了解更多的如何控制open vswitch中的流,可以参考http://openvswitch.org中对ovs-ofctl的描述。

Network Namespaces (netns)

网络namespace是linux上一个很cool的特性,它的用途很多。在openstack网络中被广泛使用。网络namespace是拥有独立的网络配置隔离容器,并且该网络不能被其他名字空间看到。网络名字空间可以被用于封装特殊的网络功能或者在对网络服务隔离的同时完成一个复杂的网络设置。在Oracle OpenStack Tech Preview中我们使用最新的R3企业版内核,该内核提供给了对netns的完整支持。

通过如下例子我们展示如何使用netns命令控制网络namespaces。定义一个新的namespace:

  1. # ip netns add my-ns
  2. # ip netns list
  3. my-ns

我们说过namespace是一个隔离的容器,我们可以在namspace中进行各种操作,比如ifconfig命令。

  1. # ip netns exec my-ns ifconfig -a
  2. lo        Link encap:Local Loopback
  3. LOOPBACK  MTU:16436 Metric:1
  4. RX packets:0 errors:0 dropped:0 overruns:0 frame:0
  5. TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
  6. collisions:0 txqueuelen:0
  7. RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

我们可以在namespace中运行任何命令,比如对debug非常有用的tcddump命令,我们使用ping、ssh、iptables命令。连接namespace和外部:连接到namespace和namespace直接连接的方式有很多,我们主要聚集在openstack中使用的方法。openstack使用了OVS和网络namespace的组合。OVS定义接口,然后我们将这些接口加入namespace中。

  1. # ip netns exec my-ns ifconfig -a
  2. lo        Link encap:Local Loopback
  3. LOOPBACK  MTU:65536 Metric:1
  4. RX packets:0 errors:0 dropped:0 overruns:0 frame:0
  5. TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
  6. collisions:0 txqueuelen:0
  7. RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
  8. my-port   Link encap:Ethernet HWaddr 22:04:45:E2:85:21
  9. BROADCAST  MTU:1500 Metric:1
  10. RX packets:0 errors:0 dropped:0 overruns:0 frame:0
  11. TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
  12. collisions:0 txqueuelen:0
  13. RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

现在我们可以增加更多的ports到OVS bridge,并且连接到其他namespace或者其他设备比如物理网卡。Neutron使用网络namespace来实现网络服务,如DHCP、routing、gateway、firewall、load balance等。下一篇文章我们会讨论更多细节 。

Linux bridge and veth pairs

Linux bridge用于连接OVS port和虚拟机。ports负责连通OVS bridge和linux bridge或者两者与虚拟机。linux bridage主要用于安全组增强。安全组通过iptables实现,iptables只能用于linux bridage而非OVS bridage。

Veth对在openstack网络中大量使用,也是debug网络问题的很好工具。Veth对是一个简单的虚拟网线,所以一般成对出现。通常Veth对的一端连接到bridge,另一端连接到另一个bridge或者留下在作为一个网口使用。

这个例子中,我们将创建一些veth对,把他们连接到bridge上并测试联通性。这个例子用于通常的Linux服务器而非openstack节点:创建一个veth对,注意我们定义了两端的名字:

  1. # ip link add veth0 type veth peer name veth1
  2. # ifconfig -a
  3. .
  4. .
  5. veth0     Link encap:Ethernet HWaddr 5E:2C:E6:03:D0:17
  6. BROADCAST MULTICAST  MTU:1500 Metric:1
  7. RX packets:0 errors:0 dropped:0 overruns:0 frame:0
  8. TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
  9. collisions:0 txqueuelen:1000
  10. RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
  11. veth1     Link encap:Ethernet HWaddr E6:B6:E2:6D:42:B8
  12. BROADCAST MULTICAST  MTU:1500 Metric:1
  13. RX packets:0 errors:0 dropped:0 overruns:0 frame:0
  14. TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
  15. collisions:0 txqueuelen:1000
  16. RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
  17. .
  18. .

为了让例子更有意义,我们将创建如下配置:

  1. veth0 => veth1 =>br-eth3 => eth3 ======> eth2 on another Linux server

br-eht3: 一个基本的Linux bridge,连接veth1和eth3eth3: 一个没有设定IP的物理网口,该网口连接着斯有网络eth2: 远端Linux服务器上的一个物理网口,连接着私有网络并且被配置了IP(50.50.50.1)一旦我们创建了这个配置,我们将通过veth0 ping 50.50.50.1这个远端IP,从而测试网络联通性:

  1. # brctl addbr br-eth3
  2. # brctl addif br-eth3 eth3
  3. # brctl addif br-eth3 veth1
  4. # brctl show
  5. bridge name     bridge id               STP enabled     interfaces
  6. br-eth3         8000.00505682e7f6       no              eth3
  7. veth1
  8. # ifconfig veth0 50.50.50.50
  9. # ping -I veth0 50.50.50.51
  10. PING 50.50.50.51 (50.50.50.51) from 50.50.50.50 veth0: 56(84) bytes of data.
  11. 64 bytes from 50.50.50.51: icmp_seq=1 ttl=64 time=0.454 ms
  12. 64 bytes from 50.50.50.51: icmp_seq=2 ttl=64 time=0.298 ms
  13. # ethtool -S veth1NIC statistics:peer_ifindex: 12# ip link..12: veth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000

如果命名不像例子中这么显而易见,导致我们无法支持veth设备的两端,我们可以使用ethtool命令查询。ethtool命令返回index号,通过ip link命令查看对应的设备:

  1. # ethtool -S veth1
  2. NIC statistics:
  3. peer_ifindex: 12
  4. # ip link
  5. .
  6. .
  7. 12: veth0:  mtu 1500 qdisc pfifo_fast state UP qlen 1000

总结

文章中,我们快速了解了OVS/网络namespaces/Linux bridges/veth对。这些组件在openstack网络架构中大量使用,理解这些组件有助于我们理解不同的网络场景。下篇文章中,我们会了解虚拟机之间/虚拟机与外部网络之间如何进行通信。

深入理解openstack网络架构(1)的更多相关文章

  1. 深入理解openstack网络架构(4)-----连接到public network

    原文地址: https://blogs.oracle.com/ronen/entry/diving_into_openstack_network_architecture3 译文转自:http://b ...

  2. 深入理解openstack网络架构(2)----Basic Use Cases

    原文地址: https://blogs.oracle.com/ronen/entry/diving_into_openstack_network_architecture1 译文转自: http:// ...

  3. 深入理解openstack网络架构(3)-----路由

    原文地址: https://blogs.oracle.com/ronen/entry/diving_into_openstack_network_architecture2 译文转自:http://b ...

  4. openstack 网络架构 nova-network + neutron

    openstack网络架构(nova-network/neutron) openstack网络体系中,网络技术没有创新,但用到的技术点很庞杂,包含bridge.vlan.gre.vxlan.ovs.o ...

  5. openstack网络架构(nova-network/neutron)

    openstack网络体系中,网络技术没有创新,但用到的技术点非常庞杂,包括bridge.vlan.gre.vxlan.ovs.openflow.sdn.iptables等,当然这里不会做具体技术介绍 ...

  6. 一文理解OpenStack网络

    摘要:如果你能理解OpenStack的网络,那么对于其他云平台的网络,应该也可以通过分析后理解掌握了. 本文分享自华为云社区<<跟唐老师学习云网络> - OpenStack网络实现& ...

  7. openstack网络(三)

    openstack网络架构 Neutron中的基本网络元素 插件扩展功能 ML2Modular Layer 2 plugin Neutron架构图 参考资料 openstack网络架构 Neutron ...

  8. 深入理解 Neutron -- OpenStack 网络实现(3):VXLAN 模式

    问题导读1.VXLAN 模式下,网络的架构跟 GRE 模式类似,他们的不同点在什么地方?2.网络节点的作用是什么?3.tap-xxx.qr-xxx是指什么? 接上篇:深入理解 Neutron -- O ...

  9. 深入理解 Neutron -- OpenStack 网络实现(2):VLAN 模式

    问题导读 1.br-int.br-ethx的作用是什么?2.安全组策略是如何实现的?3.VLAN 模式与GRE模式有哪些不同点?流量上有哪些不同?4.L3 agent实现了什么功能? 接上篇深入理解 ...

随机推荐

  1. ue4 shooterGame 第一步 搭建git linux服务器

    1.分别在linux(服务器)上安装git.和openssh服务, 在windows(客户机)上安装cygwin,模拟linux环境以及安装windows git客户端. 2.windows的cygw ...

  2. 终端 git log 修改样式

    git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d ...

  3. js(ext)中,设置[!!异步!!]上传的简单进度条

    代码在updateHmis的历史记录中,此处存档 handler : function() { //显示进度条 Ext.MessageBox.wait('数据上传中...','提示'); //上传数据 ...

  4. 程序猿,千万别说你不了解Docker!

    放在两年前,你不认识Docker情有可原.但如果现在你还这么说,不好意思,我只能说你OUT了.你最好马上get起来,因为有可能你们公司很快就会引入Docker. 今天就和大家讨论讨论这个备受好评的应用 ...

  5. jquery修改table某列的值

    开发的过程中,我们经常会遇到一些数和值之间的转换,比如本例:学部:1.小学,2.初中,3.高中;当然实现方法很多种,可以后台代码,也可以使用脚本... 修改前: 修改后: 代码: $("#t ...

  6. Orchard源码--初步(1)

    1.打开解决方案Orachard.sln 2.直接启动项目调试 3.接着你会看到下图 呵呵,有点啰嗦( ̄︶ ̄)↗ 涨 4.点击上图的‘Finish Setup’后

  7. Android 时间维护服务 TimeService(针对于特殊定制设备)

    此方法针对于无法自动获取网络时间的特殊设备,正常 Android 设备直接调用 System.currentTimeMillis(); 方法获取当前时间即可. TimeService 集成于 Serv ...

  8. jsp页面格式时间yy-mm-dd

    这个问题把我花了1小时都没弄出来  各种报错  还是最后同学告知才知道的. 导入  :<%@ taglib uri="http://java.sun.com/jsp/jstl/func ...

  9. 时空地图TimeGIS 可编辑ArcGIS的Shape矢量文件的地理信息系统

    时空地图 TimeGIS 6.0 是一个地理信息系统软件,它可以显示网络地图,编辑ArcGIS的SHP矢量文件格式,显示NETCDF等栅格文件,管理图层等. 在它的基础上,可以二次开发各种GIS应用, ...

  10. Activity设置全屏的三种方法

    1.super.onCreate(savedInstanceState)方法之前调用:            setTheme(android.R.style.Theme_Light_NoTitleB ...