技术分享:OpenStack DVR部署与分析

概述

为了提高neutron网络服务的鲁棒性与性能,OpenStack从J版开始正式加入的DVR(Distributed Virtual Router)服务,它将原本集中在网络节点的部分服务分散到了计算节点上。

在该模式下,同租户的跨网段路由在计算节点之间直接完成,无需网络节点的参与。SNAT服务仍有网络节点集中化的处理。Floating服务则可以选择在计算节点分布式地处理,也可以选择在网络节点中心化的处理。

DVR在带来网络服务鲁棒性与性能提升的同时,也带来了一些缺陷。东西向的FWAAS服务变得无法实现,具体参考“链接”。简单来说就是FWAAS功能依赖于在同命名空间的vrouter下看到双向(有状态)的进出两条流。现在部署DVR功能后的东西向通信,打破了这条规则。下面将对OpenStack Queens版本的 DVR部署进行阐述分析。

部署

准备

已经部署好的基于租户网络是vxlan的OpenStack环境

控制节点配置

文件:neutron.conf
router_distributed = true
重启服务
systemctl restart neutron-server.service

网络节点配置

文件:openvswitch_agent.ini
l2_population=true
enable_distributed_routing = true
文件:l3_agent.ini
agent_mode =dvr_snat
external_network_bridge 留空
重启服务
systemctl restart openvswitch.service
systemctl restart neutron-openvswitch-agent.service
systemctl restart neutron-l3-agent.service
systemctl restart neutron-dhcp-agent.service
systemctl restart neutron-metadata-agent.service

计算节点配置

安装neutron相关服务
yum install openstack-neutron
修改内核配置
echo ‘
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
‘>>/etc/sysctl.conf
sysctl -p
修改配置dhcp_agent.ini,l3_agent.ini,metadata_agent.ini这3个文件。
文件:openvswitch_agent.ini
l2_population=true
enable_distributed_routing = true
文件:l3_agent.ini
agent_mode =dvr
external_network_bridge 留空
添加对外网桥,eth_TBD,IP_TBD要根据实际环境而定
echo ‘#
ovs-vsctl add-br br-ex
ovs-vsctl add-port br-ex eth_TBD
ovs-vsctl show
ifconfig eth_TBD 0.0.0.0
ifconfig br-ex IP_TBD/24
#‘>>/etc/rc.local
chmod +x /etc/rc.d/rc.local ; tail -n 8 /etc/rc.local |bash
重启服务
systemctl restart openvswitch.service
systemctl restart neutron-openvswitch-agent.service
systemctl restart neutron-l3-agent.service
systemctl restart neutron-dhcp-agent.service
systemctl restart neutron-metadata-agent.service

验证操作

在控制节点上查看network agent。

实验分析

部署虚机与网络

总览

本着“无图无真相””一图胜千言”的原则,在接下来的分析中争取多放图,少废话。
在部署好DVR,虚机,网络后,整个系统的网络组成及各节点上的功能分布如下图所示。

同节点东西向


跨节点东西向


从上表中我们可以直观的看到跨节点的路由通信过程。原理与传统路由功能基本一致。唯一的区别在进入VXLAN隧道前把原本网关MAC替换成DVR_HOST_MAC,在出VXLAN隧道后又把DVR_HOST_MAC换回网关MAC。具体原理我们将在“如何解决各节点上DVR的冲突”这一小节给出解释。

进入qrouter这个命名空间就使用linux的高级路由功能来完成路由过程。(引用《深入理解openstack neutron》中一句话:“Linux创建router并没有像创建虚机bridge那样,有一个直接的命令brctl,而且它间接命令也没有,不能创建虚拟路由器……因为它就是路由器(router)”)。在compute-1计算节点上我们可以观察到如下图所示信息。不同网段该从哪个qr口出去,不同neighbor的IP,MAC的对应关系都是有neutron事先设置好的。

NAT


这里遇到了和上一小节同样的问题。具体原理我们将在“如何解决各节点上DVR的冲突”这一小节给出解释。

FloatingIP


如何解决各节点上DVR的冲突

在各节点上的vrouter其qr口的IP,MAC都是图中各network:router_interface_distributed Port的IP,MAC.在这种情况下,各节点中的VM是如何正确的找到同宿主机下正确的vrouter及正确的网关的呢?

让我们看一下br-tun上的部分流表

从图中可知,br-int中进入br-tun中的所有流量都会经过table 1的筛选过滤。注意流表项5、6、7、8的匹配项。这4条流表把所有查询网关MAC的ARP广播报文丢弃,把所有目的MAC是网关MAC的未知单播报文都丢弃。这里就确保了一个宿主机内的VM只能感知到本宿主机内的vrouter,或者认为一些数据包是同宿主机内的vrouter给其转送数据包。

但是经过上面描述的处理后,那么三层转发报文又如何能到达其他节点呢?这里我们看一段社区给出的说明。

在初始化期间,OVS agent需要知道其持有的唯一的DVR MAC地址,以此在br-tun,br-int中输入正确的流表项。出于这个目的,L2 agent通过RPC的方式调用ML2 plugin中的get_dvr_mac_address(host_id)函数。

让我们去控制节点看看这个dvr_mac_address又是什么。在Tables_in_neutron中找到一张名为dvr_host_macs的表,查询其中的内容我们是不是又发现了熟悉的MAC。这些都是neutron分配的,全局唯一的,与各节点一一对应的MAC地址。如果有心的话在配置控制节点的neutron.conf文件时,可以看到有个名为”dvr_base_mac”配置项,该项可以自定义DVR MAC的前缀高位。

所有跨界点的三层通信,在出节点前都会把源MAC是网关MAC的报文,把源MAC都替换成各节点都唯一的DVR host MAC。这里也就解释了上面跨节点东西向和NAT中遗留的问题了。

总结

从实质上讲,neutron的DVR模式并没有使用任何颠覆性的技术手段。可以说也就是把原有的VRouter给Distribute了。至于生产环境中是否需要采用DVR功能,可能这也是网络性能,鲁棒性与网络可维护性,是否需要东西向FWAAS之间的博弈。

原文地址:http://blog.51cto.com/99cloud/2286711

时间: 2024-07-31 14:36:26

技术分享:OpenStack DVR部署与分析的相关文章

恒天云技术分享系列4 – OpenStack网络攻击与防御

恒天云技术分享系列:http://www.hengtianyun.com/download-show-id-13.html 云主机的网络结构本质上和传统的网络结构一致,区别大概有两点. 1.软网络管理设备(如nova-network,open switch)部分替代硬件网络设备 . 2.多虚拟服务器共享一个宿主机物理网卡(使用Trunk技术). 那么对于云服务器的安全,我们也可以采用传统的网络安全技术去防御.对于云主机,我们同时也需要做好宿主机的防火墙配置,以及安全设置. 1.对于虚拟机进行虚拟

openstack swift 源码分析之swift单机部署

本文对在单机部署swift 其中每一个细节做详细的介绍,并对配置做相应的解释 PC物理机    Ubuntu-12.04-desktop-64位 Swift 版本:1.13.1 Swift-client   1.2.0 注意:本文所有操作都是在root权限下进行的. 1 .下载swift 和swift-client 源代码,本文利用git从github获取其源代码 获取swift源代码 git clone https://github.com/openstack/swift.git 获取pyth

二、OpenStack入门 之 架构分析

OpenStack入门 之 架构分析 写在前面 学习目标: 了解 OpenStack 各组件的逻辑关系: 了解 OpenStack 的各组件的通信和部署关系: 了解 OpenStack 的工作流程: 接下来我会掌握: OpenStack 组件间的逻辑关系: OpenStack 的API: OpenStack 组件间的通信关系: OpenStack 中几种不同的存储: OpenStack 工作流程: OpenStack 的部署架构: OpenStack 各组件之间的关系有:逻辑关系,通信关系,部署

OpenStack入门 之 架构分析

学习目标: 了解 OpenStack 各组件的逻辑关系: 了解 OpenStack 的各组件的通信和部署关系: 了解 OpenStack 的工作流程: 接下来我会掌握: OpenStack 组件间的逻辑关系: OpenStack 的API: OpenStack 组件间的通信关系: OpenStack 中几种不同的存储: OpenStack 工作流程: OpenStack 的部署架构: OpenStack 各组件之间的关系有:逻辑关系,通信关系,部署关系- 1. OpenStack组件之间的逻辑关

OpenStack Kolla 源码分析 --Ansible

OpenStack Kolla 源码分析 –Ansible Kolla介绍 Kolla项目利用Docker.Docker-Compose.Ansible来完成部署OpenStack,目前Kolla已经能够完成一个all-in-one的开发环境的部署.从Kolla项目spec中的描述来看,主要是利用Docker容器的隔离性来达到OpenStack的原子升级.回退在升级.整个升级.回退的过程更容易控制影响范围,降低整个OpenStack的运维复杂度.Kolla 提供了生产级别的 OpenStack

知乎技术分享:从单机到2000万QPS并发的Redis高性能缓存实践之路

本文来自知乎官方技术团队的"知乎技术专栏",感谢原作者陈鹏的无私分享. 1.引言 知乎存储平台团队基于开源Redis 组件打造的知乎 Redis 平台,经过不断的研发迭代,目前已经形成了一整套完整自动化运维服务体系,提供很多强大的功能.本文作者陈鹏是该系统的负责人,本次文章深入介绍了该系统的方方面面,值得互联网后端程序员仔细研究. (本文同步发布于:http://www.52im.net/thread-1968-1-1.html) 2.关于作者 陈鹏:现任知乎存储平台组 Redis 平

融云技术分享:解密融云IM产品的聊天消息ID生成策略

本文来自融云技术团队原创分享,原文发布于“融云全球互联网通信云”公众号,原题<如何实现分布式场景下唯一 ID 生成?>,即时通讯网收录时有部分改动. 1.引言 对于IM应用来说,消息ID(或称序列号)是个看似不起眼,但非常重要的东西之一. 消息ID的使用贯穿了IM技术逻辑的方方面面,比如: 1)聊天消息的顺序保证: 2)聊天消息QoS送达保证机制时的去重: 3)特定聊天消息的精确查找和匹配: 4)聊天消息的已读未读处理: 5)聊天消息的送达回执: 6)群聊消息的扩散读拉取标记: 7)... .

感知开源的力量-APICloud Studio开源技术分享会

2014.9.15 中国领先的"云端一体"移动应用云服务提供商APICloud正式发布 2015.9.15,APICloud上线一周年,迎来第一个生日 这一天,APICloud 举办APICloud Studio开源技术分享会 我们将对APICloud Studio进行技术开源的全面解析, APICloud Studio遵循Aptana3.0 GPL开源协议,源代码以无条件继承GPL开源协议的方式贡献给业界. 我们相信,通过开源技术分享,我们将和广大开发者一起,不断扩展主流HTML开发

《大型网站技术架构-核心原理与案例分析》之一: 大型网站架构演化

最近刚刚读完李智慧的<大型网站技术架构-核心原理与案例分析>,对每章重点内容作了一些笔记,以便加深印象及日后查阅. 一.大型网站软件系统的特点 高并发,大流量:需要面对高并发用户,大流量访问. 高可用:系统7X24小时不间断服务. 海量数据:需要存储.管理海量数据,需要使用大量服务器. 用户分布广泛,网络情况复杂:许多大型互联网都是为全球用户提供服务的,用户分布范围广,各地网络情况千差万别. 安全环境恶劣:由于互联网的开放性,使得互联网站更容易受到攻击,大型网站几乎每天都会被黑客攻击. 需求快