原文地址: 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一个。

  1. # ip netns list
  2. qdhcp-63b7fcf2-e921-4011-8da9-5fc2444b42dd
  3. qdhcp-5f833617-6179-4797-b7c0-7d420d84040c

可以通过nova net-list查看network的ID信息,或者使用UI查看网络信息。

  1. # nova net-list
  2. +--------------------------------------+-------+------+
  3. | ID                                   | Label | CIDR |
  4. +--------------------------------------+-------+------+
  5. | 5f833617-6179-4797-b7c0-7d420d84040c | net1  | None |
  6. | 63b7fcf2-e921-4011-8da9-5fc2444b42dd | net2  | None |
  7. +--------------------------------------+-------+------+

我们新创建的network,net2有自己的namespace,这个namespace与net1是分离的。在namespace中,我们可以看到两个网络接口,一个local,一个是用于DHCP服务。

  1. # ip netns exec qdhcp-63b7fcf2-e921-4011-8da9-5fc2444b42dd ip addr
  2. 1: lo:  mtu 65536 qdisc noqueue state UNKNOWN
  3. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  4. inet 127.0.0.1/8 scope host lo
  5. inet6 ::1/128 scope host
  6. valid_lft forever preferred_lft forever
  7. 19: tap16630347-45:  mtu 1500 qdisc noqueue state UNKNOWN
  8. link/ether fa:16:3e:bd:94:42 brd ff:ff:ff:ff:ff:ff
  9. inet 20.20.20.3/24 brd 20.20.20.255 scope global tap16630347-45
  10. inet6 fe80::f816:3eff:febd:9442/64 scope link
  11. valid_lft forever preferred_lft forever

net1和net2两个network没有被联通,我们需要创建一个router,通过router将两个network联通。Openstack Neutron向用户提供了创建router并将两个或多个network连接的能力。router其实只是一个额外的namespace。使用Neutron创建router可以通过GUI或者命令行操作:

  1. # neutron router-create my-router
  2. Created a new router:
  3. +-----------------------+--------------------------------------+
  4. | Field                 | Value                                |
  5. +-----------------------+--------------------------------------+
  6. | admin_state_up        | True                                 |
  7. | external_gateway_info |                                      |
  8. | id                    | fce64ebe-47f0-4846-b3af-9cf764f1ff11 |
  9. | name                  | my-router                            |
  10. | status                | ACTIVE                               |
  11. | tenant_id             | 9796e5145ee546508939cd49ad59d51f     |
  12. +-----------------------+--------------------------------------+

现在我们将两个netwrok通过router连接:

查看subnet的ID:

  1. # neutron subnet-list
  2. +--------------------------------------+------+---------------+------------------------------------------------+
  3. | id                                   | name | cidr          | allocation_pools                               |
  4. +--------------------------------------+------+---------------+------------------------------------------------+
  5. | 2d7a0a58-0674-439a-ad23-d6471aaae9bc |      | 10.10.10.0/24 | {"start": "10.10.10.2", "end": "10.10.10.254"} |
  6. | 4a176b4e-a9b2-4bd8-a2e3-2dbe1aeaf890 |      | 20.20.20.0/24 | {"start": "20.20.20.2", "end": "20.20.20.254"} |
  7. +--------------------------------------+------+---------------+------------------------------------------------+

将subnet 10.10.10.0/24添加到router:

  1. # neutron router-interface-add fce64ebe-47f0-4846-b3af-9cf764f1ff11 subnet=2d7a0a58-0674-439a-ad23-d6471aaae9bc
  2. Added interface 0b7b0b40-f952-41dd-ad74-2c15a063243a to router fce64ebe-47f0-4846-b3af-9cf764f1ff11.

将subnet 20.20.20.0/24添加到router:

  1. # neutron router-interface-add fce64ebe-47f0-4846-b3af-9cf764f1ff11 subnet=4a176b4e-a9b2-4bd8-a2e3-2dbe1aeaf890
  2. Added interface dc290da0-0aa4-4d96-9085-1f894cf5b160 to router fce64ebe-47f0-4846-b3af-9cf764f1ff11.

此时,我们在查看网络拓扑会发现两个网络被router打通:

我们还可以发现两个网络接口连接到router,作为各自subnet的gateway。

我们可以看到为router创建的namespace。

  1. # ip netns list
  2. qrouter-fce64ebe-47f0-4846-b3af-9cf764f1ff11
  3. qdhcp-63b7fcf2-e921-4011-8da9-5fc2444b42dd
  4. qdhcp-5f833617-6179-4797-b7c0-7d420d84040c

我们进入namespace内部可以看到:

  1. # ip netns exec qrouter-fce64ebe-47f0-4846-b3af-9cf764f1ff11 ip addr
  2. 1: lo:  mtu 65536 qdisc noqueue state UNKNOWN
  3. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  4. inet 127.0.0.1/8 scope host lo
  5. inet6 ::1/128 scope host
  6. valid_lft forever preferred_lft forever
  7. 20: qr-0b7b0b40-f9:  mtu 1500 qdisc noqueue state UNKNOWN
  8. link/ether fa:16:3e:82:47:a6 brd ff:ff:ff:ff:ff:ff
  9. inet 10.10.10.1/24 brd 10.10.10.255 scope global qr-0b7b0b40-f9
  10. inet6 fe80::f816:3eff:fe82:47a6/64 scope link
  11. valid_lft forever preferred_lft forever
  12. 21: qr-dc290da0-0a:  mtu 1500 qdisc noqueue state UNKNOWN
  13. link/ether fa:16:3e:c7:7c:9c brd ff:ff:ff:ff:ff:ff
  14. inet 20.20.20.1/24 brd 20.20.20.255 scope global qr-dc290da0-0a
  15. inet6 fe80::f816:3eff:fec7:7c9c/64 scope link
  16. valid_lft forever preferred_lft forever

我们看到两个网络接口,“qr-dc290da0-0a“ 和 “qr-0b7b0b40-f9。这两个网络接口连接到OVS上,使用两个network/subnet的gateway IP。

  1. # ovs-vsctl show
  2. 8a069c7c-ea05-4375-93e2-b9fc9e4b3ca1
  3. Bridge "br-eth2"
  4. Port "br-eth2"
  5. Interface "br-eth2"
  6. type: internal
  7. Port "eth2"
  8. Interface "eth2"
  9. Port "phy-br-eth2"
  10. Interface "phy-br-eth2"
  11. Bridge br-ex
  12. Port br-ex
  13. Interface br-ex
  14. type: internal
  15. Bridge br-int
  16. Port "int-br-eth2"
  17. Interface "int-br-eth2"
  18. Port "qr-dc290da0-0a"
  19. tag: 2
  20. Interface "qr-dc290da0-0a"
  21. type: internal
  22. Port "tap26c9b807-7c"
  23. tag: 1
  24. Interface "tap26c9b807-7c"
  25. type: internal
  26. Port br-int
  27. Interface br-int
  28. type: internal
  29. Port "tap16630347-45"
  30. tag: 2
  31. Interface "tap16630347-45"
  32. type: internal
  33. Port "qr-0b7b0b40-f9"
  34. tag: 1
  35. Interface "qr-0b7b0b40-f9"
  36. type: internal
  37. 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。命令查看如下:

  1. # ip netns exec qrouter-fce64ebe-47f0-4846-b3af-9cf764f1ff11 sysctl net.ipv4.ip_forward
  2. 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)-----路由的更多相关文章

  1. 深入理解openstack网络架构(1)

    原文地址: https://blogs.oracle.com/ronen/entry/diving_into_openstack_network_architecture 译文转载自:http://b ...

  2. 深入理解openstack网络架构(4)-----连接到public network

    原文地址: https://blogs.oracle.com/ronen/entry/diving_into_openstack_network_architecture3 译文转自:http://b ...

  3. 深入理解openstack网络架构(2)----Basic Use Cases

    原文地址: https://blogs.oracle.com/ronen/entry/diving_into_openstack_network_architecture1 译文转自: http:// ...

  4. openstack 网络架构 nova-network + neutron

    openstack网络架构(nova-network/neutron) openstack网络体系中,网络技术没有创新,但用到的技术点很庞杂,包含bridge.vlan.gre.vxlan.ovs.o ...

  5. openstack网络架构(nova-network/neutron)

    openstack网络体系中,网络技术没有创新,但用到的技术点非常庞杂,包括bridge.vlan.gre.vxlan.ovs.openflow.sdn.iptables等,当然这里不会做具体技术介绍 ...

  6. 一文理解OpenStack网络

    摘要:如果你能理解OpenStack的网络,那么对于其他云平台的网络,应该也可以通过分析后理解掌握了. 本文分享自华为云社区<<跟唐老师学习云网络> - OpenStack网络实现& ...

  7. openstack网络(三)

    openstack网络架构 Neutron中的基本网络元素 插件扩展功能 ML2Modular Layer 2 plugin Neutron架构图 参考资料 openstack网络架构 Neutron ...

  8. 深入理解 Neutron -- OpenStack 网络实现(3):VXLAN 模式

    问题导读1.VXLAN 模式下,网络的架构跟 GRE 模式类似,他们的不同点在什么地方?2.网络节点的作用是什么?3.tap-xxx.qr-xxx是指什么? 接上篇:深入理解 Neutron -- O ...

  9. 深入理解 Neutron -- OpenStack 网络实现(1):GRE 模式

    问题导读1.什么是VETH.qvb.qvo?2.qbr的存在的作用是什么?3.router服务的作用是什么? 如果不具有Linux网络基础,比如防火墙如何过滤ip.端口或则对openstack ovs ...

随机推荐

  1. TCP/IP协议工作原理简述

    TCP/IP协议工作原理简述 // */ // ]]>   TCP/IP协议工作原理简述 Table of Contents 1 概要 2 应用层 3 传输层 4 网络层 5 链路层 1 概要 ...

  2. MAC npm 需要管理员权限问题

    我们在进行mac 命令行安装软件的时候,有的时候会遇见这样的问题:Please try running this command again as root/Administrator. 如图: 解决 ...

  3. 一个暂时无法理解的bug

    BUG bug的存在是不可避免的 一个静态变量,改成绝对地址之后可以生成静态页面.但是主页有一个用了静态变量的超链接就不能用, 最后我加了一个相对地址的静态变量,可以解决这个问题.

  4. 实战录 | 一起唠唠那些常见的DDoS攻击

    <实战录>导语 云端卫士<实战录>栏目定期会向粉丝朋友们分享一些在开发运维中的经验和技巧,希望对于关注我们的朋友有所裨益.本期分享人为云端卫士系统架构师高鹏,将带来常见的DDo ...

  5. spring知识大全(4)

    5 Spring对事务的支持 一.AOP事务的含义: 事务当作一个切面,动态地织入到目标对象,形成一个代理对象. 二.Spring的事务机制 Spring支持声明式事务. Spring使用事务服务代理 ...

  6. ActionBar

    Android actionBar 修改背景色 本来是想着自定义标题栏,发现老是出错.貌似4.0以上版本都不能自定义标题栏(我到现在都搞不清标题栏和actionBar的区别到底是什么!).原来需要自定 ...

  7. 【温故Delphi】GAEA用到Win32 API目录

    Delphi是Windows平台下著名的快速应用程序开发工具,它在VCL中封装并使用了大量的Win32 API. GAEA基于VCL开发的工具类产品,在程序中使用了大量的Win32 API,将经常用到 ...

  8. ORACLE 自动增长通过封装函数,方便调用

    好的编程习惯,是一个很有必要的过程.好的编程习惯,可以因人而异,但是简单地.基本地代码级别的就那些:写注释.合理的缩进.换行.变量命名等. 对我们程序员来说,大部分时间都对着电脑,在对着电脑的大部分时 ...

  9. 原因是出现以下错误: 80040154 没有注册类 (异常来自 HRESULT:0x80040154 (REGDB_E_CLASSNOTREG))

    场景: 客户端初始化正常,到IIS服务就报80040154. System.Web.Services.Protocols.SoapException: System.Web.Services.Prot ...

  10. mysql字段类型

    会安装mysql,会几条sql语句,会jdbc,会hibernate配置,以为就会mysql了,最近几天面试被问到mysql的问题,无地自容,系统的学习一下. mysql优化之一,选择合适的而不是最大 ...