深入理解openstack网络架构(3)-----路由
原文地址: https://blogs.oracle.com/ronen/entry/diving_into_openstack_network_architecture2
译文转自:http://blog.csdn.net/halcyonbaby/article/details/41604459
前文中,我们学习了openstack网络使用的几个基本网络组件,并通过一些简单的use case解释网络如何连通的。本文中,我们会通过一个稍微复杂(其实仍然相当基本)的use case(两个网络间路由)探索网络的设置。 路由使用的组件与连通内部网络相同,使用namespace创建一个隔离的container,允许subnet间的网络包中转。
记住我们在第一篇文章中所说的,这只是使用OVS插件的例子。openstack还有很多插件使用不同的方式,我们提到的只是其中一种。
Use case #4: Routing traffic between two isolated networks
现实中,我们会创建不同的网络用于不同的目的。我们也会需要把这些网络连接起来。因为两个网络在不同的IP段,我们需要router将他们连接起来。为了分析这种设置,我们创建另一个network(net2)并配置一个20.20.20.0/24的subnet。在创建这个network后,我们启动一个Oracle Linux的虚拟机,并连接到net2。下图是从OpenstackGUI上看到的网络拓扑图:

进一步探索,我们会在openstack网络节点上看到另一个namespace,这个namespace用于为新创建的网络提供服务。现在我们有两个namespace,每个network一个。
- # ip netns list
- qdhcp-63b7fcf2-e921-4011-8da9-5fc2444b42dd
- qdhcp-5f833617-6179-4797-b7c0-7d420d84040c
可以通过nova net-list查看network的ID信息,或者使用UI查看网络信息。
- # nova net-list
- +--------------------------------------+-------+------+
- | ID | Label | CIDR |
- +--------------------------------------+-------+------+
- | 5f833617-6179-4797-b7c0-7d420d84040c | net1 | None |
- | 63b7fcf2-e921-4011-8da9-5fc2444b42dd | net2 | None |
- +--------------------------------------+-------+------+
我们新创建的network,net2有自己的namespace,这个namespace与net1是分离的。在namespace中,我们可以看到两个网络接口,一个local,一个是用于DHCP服务。
- # ip netns exec qdhcp-63b7fcf2-e921-4011-8da9-5fc2444b42dd ip addr
- 1: lo: mtu 65536 qdisc noqueue state UNKNOWN
- link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
- inet 127.0.0.1/8 scope host lo
- inet6 ::1/128 scope host
- valid_lft forever preferred_lft forever
- 19: tap16630347-45: mtu 1500 qdisc noqueue state UNKNOWN
- link/ether fa:16:3e:bd:94:42 brd ff:ff:ff:ff:ff:ff
- inet 20.20.20.3/24 brd 20.20.20.255 scope global tap16630347-45
- inet6 fe80::f816:3eff:febd:9442/64 scope link
- valid_lft forever preferred_lft forever
net1和net2两个network没有被联通,我们需要创建一个router,通过router将两个network联通。Openstack Neutron向用户提供了创建router并将两个或多个network连接的能力。router其实只是一个额外的namespace。使用Neutron创建router可以通过GUI或者命令行操作:
- # neutron router-create my-router
- Created a new router:
- +-----------------------+--------------------------------------+
- | Field | Value |
- +-----------------------+--------------------------------------+
- | admin_state_up | True |
- | external_gateway_info | |
- | id | fce64ebe-47f0-4846-b3af-9cf764f1ff11 |
- | name | my-router |
- | status | ACTIVE |
- | tenant_id | 9796e5145ee546508939cd49ad59d51f |
- +-----------------------+--------------------------------------+
现在我们将两个netwrok通过router连接:
查看subnet的ID:
- # neutron subnet-list
- +--------------------------------------+------+---------------+------------------------------------------------+
- | id | name | cidr | allocation_pools |
- +--------------------------------------+------+---------------+------------------------------------------------+
- | 2d7a0a58-0674-439a-ad23-d6471aaae9bc | | 10.10.10.0/24 | {"start": "10.10.10.2", "end": "10.10.10.254"} |
- | 4a176b4e-a9b2-4bd8-a2e3-2dbe1aeaf890 | | 20.20.20.0/24 | {"start": "20.20.20.2", "end": "20.20.20.254"} |
- +--------------------------------------+------+---------------+------------------------------------------------+
将subnet 10.10.10.0/24添加到router:
- # neutron router-interface-add fce64ebe-47f0-4846-b3af-9cf764f1ff11 subnet=2d7a0a58-0674-439a-ad23-d6471aaae9bc
- Added interface 0b7b0b40-f952-41dd-ad74-2c15a063243a to router fce64ebe-47f0-4846-b3af-9cf764f1ff11.
将subnet 20.20.20.0/24添加到router:
- # neutron router-interface-add fce64ebe-47f0-4846-b3af-9cf764f1ff11 subnet=4a176b4e-a9b2-4bd8-a2e3-2dbe1aeaf890
- Added interface dc290da0-0aa4-4d96-9085-1f894cf5b160 to router fce64ebe-47f0-4846-b3af-9cf764f1ff11.
此时,我们在查看网络拓扑会发现两个网络被router打通:

我们还可以发现两个网络接口连接到router,作为各自subnet的gateway。
我们可以看到为router创建的namespace。
- # ip netns list
- qrouter-fce64ebe-47f0-4846-b3af-9cf764f1ff11
- qdhcp-63b7fcf2-e921-4011-8da9-5fc2444b42dd
- qdhcp-5f833617-6179-4797-b7c0-7d420d84040c
我们进入namespace内部可以看到:
- # ip netns exec qrouter-fce64ebe-47f0-4846-b3af-9cf764f1ff11 ip addr
- 1: lo: mtu 65536 qdisc noqueue state UNKNOWN
- link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
- inet 127.0.0.1/8 scope host lo
- inet6 ::1/128 scope host
- valid_lft forever preferred_lft forever
- 20: qr-0b7b0b40-f9: mtu 1500 qdisc noqueue state UNKNOWN
- link/ether fa:16:3e:82:47:a6 brd ff:ff:ff:ff:ff:ff
- inet 10.10.10.1/24 brd 10.10.10.255 scope global qr-0b7b0b40-f9
- inet6 fe80::f816:3eff:fe82:47a6/64 scope link
- valid_lft forever preferred_lft forever
- 21: qr-dc290da0-0a: mtu 1500 qdisc noqueue state UNKNOWN
- link/ether fa:16:3e:c7:7c:9c brd ff:ff:ff:ff:ff:ff
- inet 20.20.20.1/24 brd 20.20.20.255 scope global qr-dc290da0-0a
- inet6 fe80::f816:3eff:fec7:7c9c/64 scope link
- valid_lft forever preferred_lft forever
我们看到两个网络接口,“qr-dc290da0-0a“ 和 “qr-0b7b0b40-f9。这两个网络接口连接到OVS上,使用两个network/subnet的gateway IP。
- # ovs-vsctl show
- 8a069c7c-ea05-4375-93e2-b9fc9e4b3ca1
- Bridge "br-eth2"
- Port "br-eth2"
- Interface "br-eth2"
- type: internal
- Port "eth2"
- Interface "eth2"
- Port "phy-br-eth2"
- Interface "phy-br-eth2"
- Bridge br-ex
- Port br-ex
- Interface br-ex
- type: internal
- Bridge br-int
- Port "int-br-eth2"
- Interface "int-br-eth2"
- Port "qr-dc290da0-0a"
- tag: 2
- Interface "qr-dc290da0-0a"
- type: internal
- Port "tap26c9b807-7c"
- tag: 1
- Interface "tap26c9b807-7c"
- type: internal
- Port br-int
- Interface br-int
- type: internal
- Port "tap16630347-45"
- tag: 2
- Interface "tap16630347-45"
- type: internal
- Port "qr-0b7b0b40-f9"
- tag: 1
- Interface "qr-0b7b0b40-f9"
- type: internal
- ovs_version: "1.11.0"
我们可以看到,这些接口连接到”br-int",并打上了所在network对应的VLAN标签。这里我们可以通过gateway地址(20.20.20.1)成功的ping通router namespace:

我们还可以看到IP地址为20.20.20.2可以ping通IP地址为10.10.10.2的虚拟机:

两个subnet通过namespace中的网络接口互相连通。在namespace中,Neutron将系统参数net.ipv4.ip_forward设置为1。命令查看如下:
- # ip netns exec qrouter-fce64ebe-47f0-4846-b3af-9cf764f1ff11 sysctl net.ipv4.ip_forward
- net.ipv4.ip_forward = 1
我们可以看到namespace中的系统参数net.ipv4.ip_forward被设置,这种设置不会对namespace外产生影响。
总结
创建router时,Neutron会创建一个叫qrouter-的namespace。subnets通过OVS的br-int网桥上的网络接口接入router。网络接口被设置了正确的VLAN,从而可以连入它们对应的network。例子中,网络接口qr-0b7b0b40-f9的IP被设置为10.10.10.1,VLAN标签为1,它可以连接到“net1”。通过在namespace中设置系统参数net.ipv4.ip_forward为1,从而允许路由生效。
本文介绍了如何使用network namespace创建一个router。下一篇文章中,我们会探索浮动IP如何使用iptables工作。这也许更复杂但是依然使用这些基本的网络组件。
深入理解openstack网络架构(3)-----路由的更多相关文章
- 深入理解openstack网络架构(1)
原文地址: https://blogs.oracle.com/ronen/entry/diving_into_openstack_network_architecture 译文转载自:http://b ...
- 深入理解openstack网络架构(4)-----连接到public network
原文地址: https://blogs.oracle.com/ronen/entry/diving_into_openstack_network_architecture3 译文转自:http://b ...
- 深入理解openstack网络架构(2)----Basic Use Cases
原文地址: https://blogs.oracle.com/ronen/entry/diving_into_openstack_network_architecture1 译文转自: http:// ...
- openstack 网络架构 nova-network + neutron
openstack网络架构(nova-network/neutron) openstack网络体系中,网络技术没有创新,但用到的技术点很庞杂,包含bridge.vlan.gre.vxlan.ovs.o ...
- openstack网络架构(nova-network/neutron)
openstack网络体系中,网络技术没有创新,但用到的技术点非常庞杂,包括bridge.vlan.gre.vxlan.ovs.openflow.sdn.iptables等,当然这里不会做具体技术介绍 ...
- 一文理解OpenStack网络
摘要:如果你能理解OpenStack的网络,那么对于其他云平台的网络,应该也可以通过分析后理解掌握了. 本文分享自华为云社区<<跟唐老师学习云网络> - OpenStack网络实现& ...
- openstack网络(三)
openstack网络架构 Neutron中的基本网络元素 插件扩展功能 ML2Modular Layer 2 plugin Neutron架构图 参考资料 openstack网络架构 Neutron ...
- 深入理解 Neutron -- OpenStack 网络实现(3):VXLAN 模式
问题导读1.VXLAN 模式下,网络的架构跟 GRE 模式类似,他们的不同点在什么地方?2.网络节点的作用是什么?3.tap-xxx.qr-xxx是指什么? 接上篇:深入理解 Neutron -- O ...
- 深入理解 Neutron -- OpenStack 网络实现(1):GRE 模式
问题导读1.什么是VETH.qvb.qvo?2.qbr的存在的作用是什么?3.router服务的作用是什么? 如果不具有Linux网络基础,比如防火墙如何过滤ip.端口或则对openstack ovs ...
随机推荐
- 【如何快速的开发一个完整的iOS直播app】(原理篇)
原文转自:袁峥Seemygo 感谢分享.自我学习 目录 [如何快速的开发一个完整的iOS直播app](原理篇) [如何快速的开发一个完整的iOS直播app](播放篇) [如何快速的开发一个完整的 ...
- 《Objective-C编程》部分示例
<Objective-C编程>部分示例 最近在看<Objective-C编程>顺带实现了书中部分示例代码.如果感兴趣可以自行 下载(点我). 通过本书大致了解了Objectiv ...
- MyISAM和InnoDB索引区别
MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址.下图是MyISAM索引的原理图: 图8 这里设表一共有三列,假设我们以Col1为主键,则图8是一个MyISAM表 ...
- CSS布局技巧 -- 纯CSS让子元素的宽度总和决定其父元素的宽度
使用场景 在移动端屏幕宽度有限的前提下,使用横向滚动的方式展示更多的内容.在这样的需求下,希望父元素作为容器,其宽度可以又横向排列资源的总宽度动态撑开,超过祖父元素的宽度:在不超过祖父元素时,自动继承 ...
- 【笔记】memorymanagement-whitepaper-150215
3 GC概念 Gc的职责: 1) 分配内存 2) 保证被引用的对象驻留内存 3) 对象不可达后将其占用内存回收 被引用对象被称为 “存活对象”. 不再被引用的对象称为“垃圾对象”. 找到垃圾对象 ...
- STM32 GPIO外部中断总结
一.STM32中断分组: STM32 的每一个GPIO都能配置成一个外部中断触发源,这点也是 STM32 的强大之处.STM32 通过根据引脚的序号不同将众多中断触发源分成不同的组,比如:PA0,PB ...
- zTree+EasyUi做权限遇到的小问题
最近需要做一个zTree+EasyUi的权限管理系统,以前有过接触,在做这一块时,用到了ztree,树来加载咱们的菜单栏,后台获取登录用户信息的权限列表,转换成json对象来加载到咱们的树当中,代码如 ...
- 配置MySQL数据库
一.配置MySQL数据库 1.解压绿色版mysql,如下图 二.安装服务 1.运行cmd(管理员版本,否则没有权限),如下图 2.运行命令mysqld –install安装服务,如下图: 如果不需要m ...
- springboot使用之四:错误页面404处理建议
每个项目可能都会遇到404,403,500等错误代码,如没有错误页面,则会给用户一个很不友好的界面,springboot项目同样也存在这个问题. 但在官方文档并没有相关配置信息,这就要求我们自己来实现 ...
- 复星昆仲杨光:VR行业四大痛点
2016年,可是说是VR产业的爆发之年,从公司层面到资本层面都对VR产业给予了厚望,期望其能够在移动互联网之后带来革命性的突破,掀起新一轮技术主导的商业革命.而创业者们已经跃跃欲试,期望在资本的支持下 ...