热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

OpenStack计算节点上虚拟网络(Neutron)详解

场景(一个租户,两个网络,一个路由,内部网络使用GRE,LibvirtVIFDriver使用LibvirtHy

场景(一个租户,两个网络,一个路由,内部网络使用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 命令我们大概可以获得像这样输出(截取前半部分):

 

+--------------------------------------+-------------------------------

|

| Property                             | Value                                                    |

+--------------------------------------+-------------------------------

| Internal network                     | 10.18.0.3, 172.16.19.232                                 |

| OS-DCF:diskConfig                    | MANUAL                                                   |

| OS-EXT-AZ:availability_zone          | nova                                                     |

| OS-EXT-SRV-ATTR:host                 | compute1                                                 |

| OS-EXT-SRV-ATTR:hypervisor_hostname  | compute1                                                 |

| OS-EXT-SRV-ATTR:instance_name        | instance-0000001e                                        |

 

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

 

   

 

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

 

qbr48e06cd2-60       8000.bed5536ff312 no     qvb48e06cd2-60tap48e06cd2-60

 

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

 

  *-network:5description: Ethernet interface physical id: 7 logical name: qvb48e06cd2-60 serial: be:d5:53:6f:f3:12 size: 10Gbit/s capabilities: ethernet physical configuration: autonegotiation=off broadcast=yes driver=veth driverversion=1.0 duplex=full firmware=N/A link=yes multicast=yes port=twisted pair promiscuous=yes speed=10Gbit/s

 

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

 

# ethtool -S qvb48e06cd2-60NIC statistics: peer_ifindex: 16

 

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

 

16: qvo48e06cd2-60: mtu 1500 qdisc pfifo_fast state UP qlen 1000link/ether aa:c0:0f:d2:e2:43 brd ff:ff:ff:ff:ff:ff

 

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

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

# ovs-vsctl show
1910d375-2692-4214-acdf-d364382c25a4
Bridge br-int
Port br-int
Interface br-int
type: internal
Port patch-tun
Interface patch-tun
type: patch
options: {peer=patch-int}
Port "qvo48e06cd2-60"
tag: 1
Interface "qvo48e06cd2-60"
Port "qvodfdc29e2-9a"
tag: 2
Interface "qvodfdc29e2-9a"
Port "qvo18cec000-80"
tag: 2
Interface "qvo18cec000-80"
Port "qvob86d15f1-8f"
tag: 1
Interface "qvob86d15f1-8f"
Bridge br-tun
Port br-tun
Interface br-tun
type: internal
Port patch-int
Interface patch-int
type: patch
options: {peer=patch-tun}
Port "gre-1"
Interface "gre-1"
type: gre
options: {in_key=flow, local_ip="192.168.10.11", out_key=flow, remote_ip="192.168.10.10"}
ovs_version: "1.11.0"

果然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 FAQ     和    Connecting OVS Bridges with Patch Ports     。 

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

 

# ovs-ofctl dump-flows br-intNXST_FLOW reply (xid=0×4):         

COOKIE=0×0, duration=246746.016s, table=0, n_packets=702, n_bytes=78521, idle_age=1324, hard_age=65534, priority=1 actions=NORMAL

 

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

 

OFPST_PORT_DESC reply (xid=0x2):1(patch-int): addr:ea:a2:71:f5:9f:ad config:     0 state:      0 speed: 0 Mbps now, 0 Mbps max 2(gre-1): addr:d6:89:b0:03:d2:72 config:     0 state:      0 speed: 0 Mbps now, 0 Mbps max LOCAL(br-tun): addr:9a:49:9a:35:d1:4e config:     0 state:      0 speed: 0 Mbps now, 0 Mbps max

 

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

 

ID TAB PKT       PRI   MATCH                                                       ACT

0  0   339       1     in=1                                                        resubmit(,1)

1  0   285       1     in=2                                                        resubmit(,2)

2  0   3         0     *                                                           drop

3  1   216       0     dl_dst=00:00:00:00:00:00/01:00:00:00:00:00              resubmit(,20)

4  1   123       0     dl_dst=01:00:00:00:00:00/01:00:00:00:00:00              resubmit(,21)

5  10  363       1     *                                                           learn(table=20,hard_timeout=300,priority=1,NXM_OF_VLAN_TCI[0..11],NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],load:0->NXM_OF_VLAN_TCI[],load:NXM_NX_TUN_ID[]->NXM_NX_TUN_ID[],output:NXM_OF_IN_PORT[]),output:1

6  2   341       1     tun_id=0x2                                             mod_vlan_vid:1,resubmit(,10)

7  2   17        1     tun_id=0x3                                             mod_vlan_vid:2,resubmit(,10)

8  2   3         0     *                                                           drop

9  20  0         0     *                                                           resubmit(,21)

10 21  3         1     vlan=2                                          strip_vlan,set_tunnel:0x3,output:2

11 21  16        1     vlan=1                                          strip_vlan,set_tunnel:0x2,output:2

12 21  4         0     *                                                            drop

13 3   0         0     *                                                            drop

 

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

 

0. 表0:当匹配到从port 1(patch-int)进入的包时,提交给表1继续匹配;3. 表1:当目标MAC地址为单播地址时,提交给表20继续匹配;         

4. 表1:当目标MAC地址为多播/广播地址时,提交给表21继续匹配;、

9. 表20:提交给21继续匹配(这个表并非只是转发,当OVS根据表10动态建立自动学习的规则时,会添加到表20,比如下面这条流表规则是自动建立的目标MAC地址为路由的规则:“COOKIE = 0×0, duration = 11.099s, table = 20, n_packets = 45, n_bytes = 6132, hard_timeout = 300, idle_age = 3, hard_age = 2, priority = 1,vlan_tci = 0×0001/0x0fff,dl_dst = fa:16:3e:a1:3f:19 actions = load:0 -> NXM_OF_VLAN_TCI[], load:0×2 -> NXM_NX_TUN_ID[], output:2”);

10. 表21:当目标VLan标签为2时,剥去VLan标签,然后将Tunnel Key设置为3(GRE通道的Key,详见            rfc2890             的相关描述)并从port 2(gre-1)发出去;         

11. 表21:当目标VLan标签为1时,剥去VLan标签,然后将Tunnel Key设置为2并从port 2(gre-1)发出去;

12. 表21:对没成功匹配的包,丢弃。

 

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

 

1. 表0:当匹配到从port 2(gre-1)进入的包时,提交给表2继续匹配;6. 表2:当Tunnel Key为2时,添加VLan tag 1,提交给表10继续匹配;         

7. 表2:当Tunnel Key为3时,添加VLan tag 2,提交给表10继续匹配;

5. 表10:首先从报文中学习VLan、MAC等信息并把规则添加表20,然后再从port 1(patch-int)发出去。

 

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

 


推荐阅读
  • 集成度|窄带_信而泰OLT使用介绍网络测试仪实操
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了信而泰OLT使用介绍-网络测试仪实操相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文详细介绍了一种利用 ESP8266 01S 模块构建 Web 服务器的成功实践方案。通过具体的代码示例和详细的步骤说明,帮助读者快速掌握该模块的使用方法。在疫情期间,作者重新审视并研究了这一未被充分利用的模块,最终成功实现了 Web 服务器的功能。本文不仅提供了完整的代码实现,还涵盖了调试过程中遇到的常见问题及其解决方法,为初学者提供了宝贵的参考。 ... [详细]
  • 计算机视觉领域介绍 | 自然语言驱动的跨模态行人重识别前沿技术综述(上篇)
    本文介绍了计算机视觉领域的最新进展,特别是自然语言驱动的跨模态行人重识别技术。上篇内容详细探讨了该领域的基础理论、关键技术及当前的研究热点,为读者提供了全面的概述。 ... [详细]
  • VLAN 与三层交换
    目录一、VLAN的概念及优势1.1.分割广播域1.2.VLAN的优势二、VLAN的种类2.1.静态VLAN2.2.动态VLAN三、静态VLAN配置3.1.VLAN的范围3.2.VL ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • javascript分页类支持页码格式
    前端时间因为项目需要,要对一个产品下所有的附属图片进行分页显示,没考虑ajax一张张请求,所以干脆一次性全部把图片out,然 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 思科IOS XE与ISE集成实现TACACS认证配置
    本文详细介绍了如何在思科IOS XE设备上配置TACACS认证,并通过ISE(Identity Services Engine)进行用户管理和授权。配置包括网络拓扑、设备设置和ISE端的具体步骤。 ... [详细]
  • poj 3352 Road Construction ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 在分析和解决 Keepalived VIP 漂移故障的过程中,我们发现主备节点配置如下:主节点 IP 为 172.16.30.31,备份节点 IP 为 172.16.30.32,虚拟 IP 为 172.16.30.10。故障表现为监控系统显示 Keepalived 主节点状态异常,导致 VIP 漂移到备份节点。通过详细检查配置文件和日志,我们发现主节点上的 Keepalived 进程未能正常运行,最终通过优化配置和重启服务解决了该问题。此外,我们还增加了健康检查机制,以提高系统的稳定性和可靠性。 ... [详细]
  • 在Cisco IOS XR系统中,存在提供服务的服务器和使用这些服务的客户端。本文深入探讨了进程与线程状态转换机制,分析了其在系统性能优化中的关键作用,并提出了改进措施,以提高系统的响应速度和资源利用率。通过详细研究状态转换的各个环节,本文为开发人员和系统管理员提供了实用的指导,旨在提升整体系统效率和稳定性。 ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • Squaretest:自动生成功能测试代码的高效插件
    本文将介绍一款名为Squaretest的高效插件,该工具能够自动生成功能测试代码。使用这款插件的主要原因是公司近期加强了代码质量的管控,对各项目进行了严格的单元测试评估。Squaretest不仅提高了测试代码的生成效率,还显著提升了代码的质量和可靠性。 ... [详细]
  • PostgresX2 MPP部署试验
    2019独角兽企业重金招聘Python工程师标准MPP结构:129GTM节点,130coordinator、gtm_proxy、datanode& ... [详细]
author-avatar
Rianbow_小渊渊设
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有