讲清楚说明白openstack中vm流量走向之1——集中式网络节点

一、背景介绍

openstack被广大公有云厂商所采用,对于公有云场景来讲Newtron组件所提供的网络功能,一直是较难理解的部分,本文详细介绍在openstack集中网络节点架构下,vm的南北向与东西向流量实现。

二、网络节点功能

由于openstack默认部署模式下,计算节点通过ml2插件实现二层互通,所有三层流量都要经过网络节点,如下图所示:

图中同一tenant下有2个不同子网,vm1/2和vm3/4分别属于不同的subnet,通过上图可以看出不同子网之间通信,以及未绑定fip的vm与公网间通信,和拥有fip的vm通过公网访问都需要经过网络节点,网络节点存在单点隐患,对此需要通过L3 HA来对该节点进行高可用。

三、openstack中的网络类型

openstack中网络模式分为2种:provider网络和self-service网络。provider是一个半虚拟化的二层网络架构,只能通过桥接的方式实现,处于provider网络模式下vm获取到的ip地址与物理网络在同一网段,可以看成是物理网络的扩展,在该模式下,控制节点不需要安装L3 agent,也不需要网络节点,vm直接通过宿主机的NIC与物理网络通信,provider网络只支持flat和vlan两种模式。其架构如下:

而self-service模式允许租户自己创建网络,最终租户创建的网络借助provider网络以NAT方式访问外网,所以self-service模式可以看成是网络层级的延伸,要实现self-service模式必须先创建provider网络,self-service网络支持flat、vlan、vxlan、gre模式。其架构如下:

vm从self-service获取到的IP地址称为fix ip,vm从provider网络获取到的IP地址称为floating IP。不管租户创建的网络类型为vxlan或者vlan(br-tun或br-vlan)租户vm之间通过fix ip之间的互访流量称为东西走向,只有当vm需要通过snat访问外网或者从通过fip访问vm时,此时的流量称为南北走向。

四、网络节点内部组件

相对于计算机点,网络节点中多了租户的dhcp和router空间和连接internet的br-ex(计算节点同样拥有br-int和br-tun/vlan的OVS,详见作者其他博文),
网络节点的内部组件通信如下图所示:

从上图得知:fix ip最终需要借助router namespace中的iptables规则,以sant或dnat的方式实现vm访问外网或被外网访问。当然也可以让vm直接接入provider网络,但provider网络只是一个二层的虚拟化网络,需要借助物理设备来实现三层及以上功能。以下就以self-service模式为例,详细说明vm的东西和南北流量走向。

五、vm的东西流量分析

通过前面知道,一个tenant可以创建多个subnet,此时vm之间的通信就分为同一个subnet和不同subnet之间两种情况,区别就是,不同subnet之间的通信需要经过网关(网络节点),而同subnet之间的通信不需要经过网络节点。

1.不同subnet之间的通信

无论tenant创建的网络类型是隧道还是vlan,不同subnet之间的通信必须借助L3 Agent完成,而在集中式网络节点架构中,只有网络节点部署了该角色,vm之间的流量如下图所示:

1.vm1向vm2发出通信请求,根据目的IP地址得知vm2和自己不在同一网段,将数据包送往网关。
2.数据包经过linux bridge通过其上的iptables安全策略检查,按后送往br-int并打上内部vlan号。
3.数据包脱掉br-int的内部vlan号进入br-tun/br-vlan。
4.进入br-tun的数据包此时vxlan封装并打上vni号,进入br-vlan的数据包此时打上外部vlan号,通过nic离开compute1。
5.数据包进入网络节点,经过br-tun的数据包完成vxlan的解封装去掉vni号,经过br-vlan的数据包去掉vlan号。
6.数据包进入br-int,此时会被打上内部vlan号。
7.进入router namespace路由空间查询路由表项,vm1和vm2的网关配置在此路由器接口qr上。
8.数据包在此路由器上完成地址转换,送回br-int并打上内部vlan号。
9.数据包脱掉br-int的内部vlan号进入br-tun/br-vlan。
10.进入br-tun的数据包此时vxlan封装并打上vni号,进入br-vlan的数据包此时打上外部vlan号,通过nic离开network node。
11.数据包进入compute2,经过br-tun的数据包完成vxlan的解封装去掉vni号,经过br-vlan的数据包去掉vlan号。
12.数据包进入br-int,此时会被打上内部vlan号。
13.数据包经过离开br-int并去掉内部vlan号,送往linux bridge通过其上的iptables安全策略检查。
14.最后数据包送到vm2。

2.相同subnet间通信

相同subnet之间通信不需要借助L3 Agent,vm之间流量如下图所示:

1.vm1向vm2发起请求,通过目的IP地址得知vm2与自己在同一网段。
2.数据包经过linux bridge,进行安全策略检查,进入br-int打上内部vlan号。
3.数据包脱掉br-int的内部vlan号进入br-tun/br-vlan。
4.进入br-tun的数据包此时vxlan封装并打上vni号,进入br-vlan的数据包此时打上外部vlan号,通过nic离开compute1。
5.数据包进入compute2,经过br-tun的数据包完成vxlan的解封装去掉vni号,经过br-vlan的数据包去掉vlan号。
6.数据包进入br-int,此时会被打上内部vlan号。
7.数据包经过离开br-int并去掉内部vlan号,送往linux bridge通过其上的iptables安全策略检查。
8.最后数据包送到vm2。

六、vm的南北流量分析

南北流量也分为有floating ip和无floating ip(fix ip)两种情况,唯一的区别在于vm最终离开network node访问internet时,有floating ip的vm源地址为floating ip,而使用fix ip的vm通过snat方式,源地址为network node的ip,vm南北流量如下图所示:

1.vm1向公网发出通信请求,数据包被送往网关。
2.数据包经过linux bridge通过其上的iptables安全策略检查,按后送往br-int并打上内部vlan号。
3.数据包脱掉br-int的内部vlan号进入br-tun/br-vlan,进入br-tun的数据包此时vxlan封装并打上vni号,进入br-vlan的数据包此时打上外部vlan号,通过nic离开compute1。
4.数据包进入网络节点,经过br-tun的数据包完成vxlan的解封装去掉vni号,经过br-vlan的数据包去掉vlan号,再被送往br-int,此时会被打上内部vlan号。
5.进入router namespace路由空间查询路由表项,vm1的网关配置在此路由器qr接口上。
6.数据包在此路由器上完成地址转换,源地址变成qg口network node节点的外网地址(floating ip在qg口使用的是给vm分配的外网地址,需要提前将fix ip和floating ip绑定),送回br-int并打上内部vlan号。
7.数据包离开br-int进入br-ex,脱掉内部vlan号,打上外网ip的vlan号。
8.最后借助provider网络访问公网,此处也印证了provider网络只能是vlan或flat类型。

七、网络节点HA

通过前文得知,整个架构的三层通信需要借助安装在网络节点的L3 Agent来完成,这样,网络节点在架构中就成了单点隐患,为了解决这个问题,需要对network node做高可用,L3 Agent实现ha的方式是利用keepalive的VRRP协议提供一个vip,同时在br-int和Router上增加一个ha接口,以实现心跳传递,此时网络节点的内部组件通信如下图所示:

从部署结构来看,route namespace的接口上分别是subnet的网关地址和外网地址(或者floating ip地址),所以当使用keepalive此时网络节点架构如下图所示:

至此集中网络节点模式下vm的流量就介绍完毕。

原文地址:https://blog.51cto.com/arkling/2406590

时间: 2024-10-11 00:12:23

讲清楚说明白openstack中vm流量走向之1——集中式网络节点的相关文章

讲清楚说明白openstack中vm流量走向之2——DVR模式

一.背景介绍 上一篇文章已经介绍过,在集中式网络节点模式下,所有的计算节点只安装二层代理,所有三层流量无论是南北或东西走向都必须经过网络节点,尽管可以通过HA的方式保证网络节点的高可用,但是基于vrrp的HA方式同一时间点只有一个网络节点处于工作状态,这样在大规模场景下网络节点仍然会成为性能瓶颈,为此openstack社区从Juno版本开始推出的DVR模式来解决上述问题,需要说明的是:在Mitaka版本之前DVR与L3 HA功能不能同时启用,从Mitaka版本之后才支持DVR与L3 HA功能同时

Openstack中的DVR Part1 -- 东西向流量处理

作者:Liping Mao  发表于:2014-07-04 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 在Openstack中L3router会造成流量集中的问题.不论东西向还是南北向的流量都需要流过网络节点的虚拟路由器.为了解决流量集中的问题,社区正在开打分布式虚拟路由器(DVR)的feature.本文focus在DVR中东西向流量的处理流程.南北向的处理不在本文范围内. 首先看一下东西向流量存在的问题. 一个用户创建了一个VRoute1(在Netw

在OpenStack中绕过或停用security group (iptables)

眼下.OpenStack中默认採用了security group的方式.用系统的iptables来过滤进入vm的流量.这个本意是为了安全,可是往往给调试和开发带来一些困扰. 因此,暂时性的禁用它能够排除由于iptables规则错误问题带来的网络不通等情况. 在H版本号中,能够通过改动neutron plugin.ini中的firewall配置来禁用security group. 但在I版本号中.类似的操作仅仅会让vm出来的流量都无法通过安全网桥. 因此,在正常配置启用security group

合约广告中的流量分配算法

简介 合约广告是一种基于合约的广告模式,在线广告中的一种主流方式是担保式投放(Guaranteed Delivery,GD).GD是一种量优于质的广告投放方式,需要保证广告主能够获得在合约中约定的受众用户的流量.GD中,媒体的流量按照属性划分,媒体要给不同的广告主按照合同分配约定好的流量.Ad Server的准则是希望在每一次展现满足多个合约时,选择合适的广告主,以使得每个广告主效果最好,同时能够更有效的分配流量.如下图所示,supply为媒体方,提供流量,媒体的流量可以按照性别.年龄.地域划分

也谈OpenStack中的虚拟机HA

OpenStack是一个旨在为公共及私有云的建设与管理提供软件的开源项目.它的社区拥有超过130家企业及1350位开发者,这些机构与个人都将OpenStack作为基础设施即服务(IaaS)资源的通用前端.OpenStack项目的首要任务是简化云的部署过程并为其带来良好的可扩展性.做为云计算IAAS层事实标准,OpenStack广泛的应用与各行各业.到目前为止OpenStack社区并没有一个完整的虚拟机HA解决方案.起初社区认为虚拟机的HA不是云平台层次的特性,不应该在云平台层面来实现,虚拟机的H

openstack中创建一个虚拟机经过的51步

一.前言 本文在林海峰老师"openstack创建一个VM所需的29步"基础上进行了补充和修改,文中只用到了openstack六个核心组件,为了便于理解,架构中不同组件内的rabbit mq和db为同一个(可以为每个组件配置单独的db和rabbit mq).openstack组件之间通过REST调用,组件内通过RPC协议通信,RPC协议又是基于AMQP模型实现的,rabbit mq就是运用该模型的一款软件. 二.概述 以现实中的PC举例来说明openstack创建的VM,一个PC要能正

openstack中eventlet使用

openstack中使用eventlet的协程来实现并发. 第一种,使用eventlet.GreenPool来管理绿色线程 如l3-agent在开启了8个绿色线程来处理router消息 def _process_routers_loop(self): pool = eventlet.GreenPool(size=8) while True: pool.spawn_n(self._process_router_update) 第二种是在oslo.messaging中创建接消息的进程直接创建绿色线程

部署OpenStack问题汇总(四)--openstack中nova-compute状态status显示为'XXX'的问题

第一次部署openstack的时候就遇见了这个问题,当时的版本是havana, 现在部署essex的时候又遇到了这个问题,经过一番折腾,解决了这个问题,记录下来,以免以后忘记. =========================================================== 1.查看/var/log/nova/nova-compute.log文件其中出现了这样的情况: Domain not found: no domain with matching name 'insta

Openstack中给windows加载virtion驱动

通过qemu-img将windows虚拟机的vmdk文件转换成qcow2,并将文件上传至openstack中时,发现虚拟机无法启动. 经过分析,原因是openstack默认使用的是virtio驱动,而windows虚拟机未安装virtion驱动. 解决办法:安装VirtIO驱动 1.通过virt-manager打开windows虚拟机 2.磁盘.网卡使用默认驱动,即磁盘使用ide.网卡使用rt 3.添加一块floopy设备 4.添加一块临时硬盘,设置为virtio模式 5.启动虚拟机,为新磁盘.