深入理解openstack之網(wǎng)絡(luò)設(shè)置探索
前文中,我們學(xué)習了openstack網(wǎng)絡(luò)使用的幾個基本網(wǎng)絡(luò)組件,并通過一些簡單的use case解釋網(wǎng)絡(luò)如何連通的。本文中,我們會通過一個稍微復(fù)雜(其實仍然相當基本)的use case(兩個網(wǎng)絡(luò)間路由)探索網(wǎng)絡(luò)的設(shè)置。 路由使用的組件與連通內(nèi)部網(wǎng)絡(luò)相同,使用namespace創(chuàng)建一個隔離的container,允許subnet間的網(wǎng)絡(luò)包中轉(zhuǎn)。
記住我們在***篇文章中所說的,這只是使用OVS插件的例子。openstack還有很多插件使用不同的方式,我們提到的只是其中一種。
Use case #4: Routing traffic between two isolated networks
現(xiàn)實中,我們會創(chuàng)建不同的網(wǎng)絡(luò)用于不同的目的。我們也會需要把這些網(wǎng)絡(luò)連接起來。因為兩個網(wǎng)絡(luò)在不同的IP段,我們需要router將他們連接起來。為了分析這種設(shè)置,我們創(chuàng)建另一個network(net2)并配置一個20.20.20.0/24的subnet。在創(chuàng)建這個network后,我們啟動一個Oracle Linux的虛擬機,并連接到net2。下圖是從OpenstackGUI上看到的網(wǎng)絡(luò)拓撲圖:
進一步探索,我們會在openstack網(wǎng)絡(luò)節(jié)點上看到另一個namespace,這個namespace用于為新創(chuàng)建的網(wǎng)絡(luò)提供服務(wù)?,F(xiàn)在我們有兩個namespace,每個network一個。
- # ip netns list
- qdhcp-63b7fcf2-e921-4011-8da9-5fc2444b42dd
- qdhcp-5f833617-6179-4797-b7c0-7d420d84040c
可以通過nova net-list查看network的ID信息,或者使用UI查看網(wǎng)絡(luò)信息。
- # nova net-list
- +--------------------------------------+-------+------+
- | ID | Label | CIDR |
- +--------------------------------------+-------+------+
- | 5f833617-6179-4797-b7c0-7d420d84040c | net1 | None |
- | 63b7fcf2-e921-4011-8da9-5fc2444b42dd | net2 | None |
- +--------------------------------------+-------+------+
我們新創(chuàng)建的network,net2有自己的namespace,這個namespace與net1是分離的。在namespace中,我們可以看到兩個網(wǎng)絡(luò)接口,一個local,一個是用于DHCP服務(wù)。
- # 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沒有被聯(lián)通,我們需要創(chuàng)建一個router,通過router將兩個network聯(lián)通。Openstack Neutron向用戶提供了創(chuàng)建router并將兩個或多個network連接的能力。router其實只是一個額外的namespace。使用 Neutron創(chuàng)建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 |
- +-----------------------+--------------------------------------+
現(xiàn)在我們將兩個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.
此時,我們在查看網(wǎng)絡(luò)拓撲會發(fā)現(xiàn)兩個網(wǎng)絡(luò)被router打通:
我們還可以發(fā)現(xiàn)兩個網(wǎng)絡(luò)接口連接到router,作為各自subnet的gateway。
我們可以看到為router創(chuàng)建的namespace。
- 我們還可以發(fā)現(xiàn)兩個網(wǎng)絡(luò)接口連接到router,作為各自subnet的gateway。
- 我們可以看到為router創(chuàng)建的namespace。
我們進入namespace內(nèi)部可以看到:
- # 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
我們看到兩個網(wǎng)絡(luò)接口,“qr-dc290da0-0a“ 和 “qr-0b7b0b40-f9。這兩個網(wǎng)絡(luò)接口連接到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對應(yīng)的VLAN標簽。這里我們可以通過gateway地址(20.20.20.1)成功的ping通router namespace:
我們還可以看到IP地址為20.20.20.2可以ping通IP地址為10.10.10.2的虛擬機:
兩個subnet通過namespace中的網(wǎng)絡(luò)接口互相連通。在namespace中,Neutron將系統(tǒng)參數(shù)net.ipv4.ip_forward設(shè)置為1。命令查看如下:
- # ip netns exec qrouter-fce64ebe-47f0-4846-b3af-9cf764f1ff11 sysctl net.ipv4.ip_forward
- net.ipv4.ip_forward = 1
我們可以看到namespace中的系統(tǒng)參數(shù)net.ipv4.ip_forward被設(shè)置,這種設(shè)置不會對namespace外產(chǎn)生影響。
總結(jié)
創(chuàng)建router時,Neutron會創(chuàng)建一個叫qrouter-的namespace。subnets通過OVS的br-int網(wǎng)橋上的網(wǎng)絡(luò)接口接入 router。網(wǎng)絡(luò)接口被設(shè)置了正確的VLAN,從而可以連入它們對應(yīng)的network。例子中,網(wǎng)絡(luò)接口qr-0b7b0b40-f9的IP被設(shè)置為 10.10.10.1,VLAN標簽為1,它可以連接到“net1”。通過在namespace中設(shè)置系統(tǒng)參數(shù)net.ipv4.ip_forward為 1,從而允許路由生效。
本文介紹了如何使用network namespace創(chuàng)建一個router。下一篇文章中,我們會探索浮動IP如何使用iptables工作。這也許更復(fù)雜但是依然使用這些基本的網(wǎng)絡(luò)組件。
原文出自: http://blog.csdn.net/halcyonbaby/article/details/41604459