• 深入理解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一个。

    [plain] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. # ip netns list  
    2. qdhcp-63b7fcf2-e921-4011-8da9-5fc2444b42dd  
    3. qdhcp-5f833617-6179-4797-b7c0-7d420d84040c  

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

    [plain] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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服务。 

    [plain] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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或者命令行操作:

    [plain] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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:

    [plain] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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:

    [plain] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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:

    [plain] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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。 

    [plain] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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内部可以看到:

    [plain] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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。

    [plain] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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。命令查看如下: 

    [plain] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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工作。这也许更复杂但是依然使用这些基本的网络组件。

    关注开源 国内最早的Orleans群--174511582,欢迎大家加入
  • 相关阅读:
    [题解] [NOIP2008] 双栈排序——关系的冲突至图论解法
    [搬运] [贪心]NOIP2011 观光公交
    [总结] 最短路径数问题
    [持续更新]一些zyys的题的集合
    [教程]Ubuntu下完整配置自动壁纸切换
    在NOILINUX下的简易VIM配置
    [模板]ST表浅析
    21、Android--RecyclerView
    20、Android--GridView
    19、Android--ListView
  • 原文地址:https://www.cnblogs.com/liwt/p/4979854.html
Copyright © 2020-2023  润新知