OpenStack中的VM流量走向——DVR模式


一、背景介绍

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

二、DVR模式介绍

  为了解决网络节点的流量瓶颈问题,DVR通过在计算节点部署L3 Agent,让不同subnet之间的东西流量和绑定floating ip的vm的南北流量直接通过计算节点访问外网,只有未绑定floating ip的vm的南北流量才需要通过网络节点SNAT访问外网,此时的集群架构如下图所示

  不同于集中式网络节点中所有计算节点直走二层流量,DVR模式下,每个计算节点都可以走三层流量,以此来分摊网络节点的流量压力

三、网络、计算节点的内部组件

  1.网络节点

  DVR模式下,网络节点内部组件如下图所示

  可以看到,启用DVR模式后的网络节点多了一个SNAT Namespace空间,在所有计算节点都开启DVR功能时,Router Namespace中的Metadata Agent只负责处理Project网络中的元数据,SNAT Namespace空间负责对只有fix ip的vm通过源地址转换的方式访问外网,如果所有的计算节点将DVR模式关闭,此时vm的流量和集中式网络节点一致,即所有的三层流量都需经过网络节点的Router Namespace处理

  2.计算节点

  当开启DVR功能后,此时计算节点内部组件如下图所示

  启用DVR功能的计算节点因为部署了L3 Agent组件,所以拥有Distribute Router NameSpace,并且当创建vm时,还会自动生成fip名称空间,所有计算节点的Distribute Router NameSpace完全一致,名称空间接口的ip和mac地址也一样(初始化时所有计算节点的名称空间都是源自网络节点的副本),了解网络的都知道,同一时间同一网络中ip和mac地址要一致,否则交换通过反复mac地址学习到的arp表条目会有冲突,为了解决这一问题,DVR结构为每个运行L3 Agent的计算节点指定全局唯一的mac地址(dvr_host_mac)

四、vm的东西流量分析

  1.相同subnet间通信

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

    1.vm1向vm2发起请求,通过目的IP地址得知vm2和自己在同一网段

    2.数据包经过linux bridge,进行安全策略检查,进入br-int打上内部vlan号

    3.数据包脱掉br-int的内部vlan号进入br-tun/bt-vlan

    4.进入br-tun的数据包此时vxlan封装并打上vni号,进入br-vlan的数据包此时打上外部vlan号,通过nic离开compute1

    5.数据包进入compute2,经过bt-tun的数据包完成vxlan的解封装去掉vni号,经过br-vlan的数据包去掉vlan号

    6.数据包进入br-int,此时会被打上内部vlan号

    7.数据包离开br-int并去掉内部vlan号,送往linux bridge通过其上的iptables安全策略检查

    8.最后数据包到达vm2

  2.不同subnet间通信

    1.位于compute1中的vm1向compute2中的vm2发出请求,此时源/目的ip为vm1/2的ip地址,源/目的mac地址为vm1与网关qr-1的mac地址

    2.报文经过linux bridge进行iptables安全检查,然后送往br-int

    3.进入br-int上的报文被打上内部vlan号并送往vm1的网关qr-1,qr-1接口上配置vm1的网关地址,经查表报文从qr-2口流出,qr-2接口设置vm2的网关地址

    4.从qr-2口出来的报文,此时源/目的ip为vm2网关(qr-2)的ip和vm2的ip地址,源/目的mac为qr-2口和mac和vm2的mac地址,并将报文进入br-tun

    5.报文在br-tun交换机上将源mac地址(qr-2)替换为全局唯一mac地址(dvr_host_mac),然后进行vxlan封装,离开compute1

    6.报文到达compute2后首先vxlan解封装,然后再将源mac地址(dvr_host_mac)换位vm2网关(qr-2)mac地址,送往br-int并在br-int交换机打上内部vlan号

    7.报文脱掉内部vlan号,进入linux bridge,进行安全策略检查

    8.最终数据包到达vm2

五、vm的南北流量分析

  vm南北流量分为floating ip和fix ip两种情况,对这两种情况分别进行说明

  1.fix ip访问外网

  没有绑定floating ip的vm在访问外网时需要通过网络节点的SNAT Router NameSpace进行地址转换,其流量走向如下图所示

    1.vm向外网发起请求,数据包送往linux bridge

    2.进入linux bridge的数据包经过iptables安全策略检查后将数据包送往br-int,此时打上内部vlan号

    3.数据报文从br-int送往Router NameSpace的qr口,该接口配置了vm的网关地址,在Router NameSpace内对SNAT NameSpace的sg口的mac地址进行解析,sg接口为vm所在子网的接口,该接口上的ip地址与vm在同一网段,然后将包送往br-tun

    4.数据包进入br-tun后脱掉内部vlan号,进行vxlan封装,打上vni号,离开compute1

    5.数据包进入网络节点,脱掉vni号,进行vxlan解封装,送往br-int交换机,进入br-int交换机后打上内部vlan号

    6.数据包进入sg后,进行路由查表,将数据发往fg口,fg口上配置的是可被路由公网ip

    7.数据包在fg口上进行SNAT地址转换,转换后的源ip地址为fg口上配置的公网ip访问公网

  2.floating ip访问外网

    启用DVR功能后,每台计算节点主机都安装了L3 Agent,绑定了floating ip的vm不再需要绕行到网络节点,直接由计算节点主机访问公网,其流量走向如下图所示

    1.vm向外网发起访问,由于vm是provider类型的私网地址,所以首先要去找vm地址所在的网关

    2.数据包经过linux bridge和br-int后进入Distribute NameSpace的qr口,该接口配置的ip地址为vm的网关地址

    3.数据包从qr口流出,进入rfp口,该接口上配置有2个ip地址,其中3为vm绑定floating ip地址,在此处进行SNAT地址转换,外网流量访问vm时在此名称空间利用iptables做DNAT地址转换

    4.通过qrouter与fip内部通信的直连接口(4),接口地址由L3 Agent自行维护,ip为169.254.x.x/31格式,将数据包发往fip名称空间

    5.fip空间的直连接口fpr接收到数据包后,转发给外网网关fg口

    6.fip名称空间外网网关接口将数据包发到br-ex交换机最后通过物理网卡访问Internet,外网访问vm的数据流向为该过程的反方向,不在赘述

  3.注意事项

    针对使用floating ip的数据包进出时需要注意的地方是

    1.fg接口上会额外配置一个外网ip地址,这也是为什么公有云场景下不会讲vm外网ip直接设置成公网ip地址的原因,因为每个vm都需要一个额外的地址作为fg网关地址

    2.当外部网络访问vm时,请求的ip地址是qrouter名称空间中rfp接口上做SNAT的ip地址,但此时fg接口会响应rfp接口上外网的arp地址解析请求,所以通常认为fg接口时floating ip的arp代理接口

六、网络节点HA

  通过前文得知,开启DVR模式下的网络节点只是针对没有绑定floating ip的vm进行SNAT地址转换,并且qrouter名称空间只处理元数据,所以不同于传统L3 HA对Router NameSpace的高可用,DVR下的L3 HA是对SNAT NameSpace进行的高可用,仍采用vrrp实现,如下如所示

  从部署结构来看,分别要对SNAT外网ip地址和子网接口ip地址做高可用,所以当使用keepalived时,此时架构如下图所示

链接:https://blog.51cto.com/arkling/2409789


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM