1. 程式人生 > >深入理解openstack網路架構(三)

深入理解openstack網路架構(三)

前文中,我們學習了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上看到的網路拓撲圖:

https://blogs.oracle.com/ronen/resource/openstack-routing/two-networks.png

進一步探索,我們會在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打通:

networks-routed

我們還可以發現兩個網路介面連線到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:

ping-router

我們還可以看到IP地址為20.20.20.2可以ping通IP地址為10.10.10.2的虛擬機器:

ping-vm-to-vm

兩個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工作。這也許更復雜但是依然使用這些基本的網路元件。