Neutron路由篇:L3 agent+Namespace
Neutron 的路由服务是由 l3 agent 提供的。 除此之外,l3 agent 通过 iptables 提供 firewall 和 floating ip 服务。
![](https://app.yinxiang.com/shard/s4/res/c044ec75-f4e0-431e-8aaa-bed2c109e0af.jpg)
l3 agent 需要正确配置才能工作,配置文件为 /etc/neutron/l3_agent.ini,位于控制节点或网络节点。
![](https://app.yinxiang.com/shard/s4/res/3402b919-fce0-4706-bcc0-bbdd9190a68a.jpg)
interface_driver 是最重要的选项
如果 mechanism driver 是 linux bridge,则:
interface_driver = neutron.agent.linux.interface.BridgeInterfaceDriver
如果选用 open vswitch,则:
interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
l3 agent 运行在控制或网络节点上。
![](https://app.yinxiang.com/shard/s4/res/3acff9c3-ffd6-4d59-ba61-7272c33106ee.jpg)
Neutron 虚拟路由器配置好了 L3 agent,今天将创建虚拟路由器router_100_101,打通 vlan100 和 vlan101。
打开操作菜单 Project -> Network -> Routers。
![](https://app.yinxiang.com/shard/s4/res/316fd522-b17c-4851-af67-b7e129a63fb7.jpg)
点击 Create Router 按钮
![](https://app.yinxiang.com/shard/s4/res/1623eac4-9930-43b8-a6bd-39551c21028f.jpg)
router 命名为 router_100_101,点击Create Router 按钮确认。
![](https://app.yinxiang.com/shard/s4/res/72a88e6b-4c9b-4cc7-8e3e-5a83cbb68f14.jpg)
router_100_101 创建成功。
![](https://app.yinxiang.com/shard/s4/res/750d5d42-e16d-4829-aaac-15ed9b6557bc.jpg)
接下来需要将 vlan100 和 vlan101 连接到 router_100_101。 点击router_100_101 链接进入 router 的配置页面,在 Interfaces标签中点击 Add Interface 按钮。
![](https://app.yinxiang.com/shard/s4/res/14adbe88-c5c0-4530-852e-63a7e200bf8c.jpg)
选择 vlan101 的 subnet_172_16_101_0,点击Add Interface确认。
![](https://app.yinxiang.com/shard/s4/res/2bb827b6-ce7e-44c4-b7d2-5e04829fa2a6.jpg)
用同样的方法添加 vlan100 的 subnet_172_16_100_0。
![](https://app.yinxiang.com/shard/s4/res/d6464ef9-fb10-4a96-a50b-9a08c5589522.jpg)
完成后,可以看到 router_100_101 有了两个 interface,其 IP 正好是 subnet 的 Gateway IP 172.16.100.1 和 172.16.101.1。
到这里,我们可以预见:
1. router_100_101 已经连接了 subnet_172_16_100_0 和 subnet_172_16_101_0。
2. router_100_101 上已经设置好了两个 subnet 的 Gateway IP。
3. cirros-vm1 和 cirros-vm3 应该可以通信了。
通过 PING 测试一下。
![](https://app.yinxiang.com/shard/s4/res/60455350-7c79-450c-b07e-da873e0ea23b.jpg)
判断正确,cirros-vm1 和 cirros-vm3 能通信了。
查看 cirros-vm1 的路由表,默认网关为 172.16.100.1。 同时 traceroute 告诉我们,cirros-vm1 确实是通过 router_100_101 访问到 cirros-vm3 的。
![](https://app.yinxiang.com/shard/s4/res/0bc1b8d4-4eba-41da-be4e-0b7b67ce1be8.jpg)
首先我们查看控制节点的 linux bridge 结构发生了什么变化。
![](https://app.yinxiang.com/shard/s4/res/801f7617-7f7a-4de6-a245-762257040e06.jpg)
vlan101 的 bridge 上多了一个 tape17162c5-00,从命名上可以推断该 TAP 设备对应 router_100_101 的 interface (e17162c5-00fa)。
vlan100 的 bridge 上多了一个 tapd568ba1a-74,从命名上可以推断该 TAP 设备对应 router_100_101 的 interface (d568ba1a-740e)。
当前网络结构如图所示:
![](https://app.yinxiang.com/shard/s4/res/cea51196-a862-492d-b758-d0071684b0b5.jpg)
但发现一个问题:两个 TAP 设备上并没有配置相应的 Gateway IP。
![](https://app.yinxiang.com/shard/s4/res/031f71fc-e4d2-4cff-a3b8-ce0e5144b6b9.jpg)
如果没有 Gateway IP,router_100_101 是如何完成路由的呢?
答案是: l3 agent 会为每个 router 创建了一个 namespace,通过 veth pair 与 TAP 相连,然后将 Gateway IP 配置在位于 namespace 里面的 veth interface 上,这样就能提供路由了。
通过 ip netns 查看 namespace:
![](https://app.yinxiang.com/shard/s4/res/820600b6-f82d-4815-b135-a8c12c6376f0.jpg)
router 对应的 namespace 命名为 qrouter-<router id>。
通过 ip netns exec <namespace name> ip a 命令查看 router_100_101 namespace 中的 veth interface 配置。
![](https://app.yinxiang.com/shard/s4/res/bd7ffc1e-f555-4472-9b1b-a4bf45339997.jpg)
namespace 中有两个 interface:
-
qr-e17162c5-00 上设置了 Gateway IP 172.16.101.1,与 root namespace 中的 tape17162c5-00 组成 veth pair。
-
qr-d568ba1a-74 上设置了 Gateway IP 172.16.100.1,与 root namespace 中的 tapd568ba1a-74 组成 veth pair。
网络结构如图所示:
![](https://app.yinxiang.com/shard/s4/res/20f382e4-852b-41d3-bfc8-69076c5c8806.jpg)
namespace 中的路由表也保证了 subnet_172_16_100_0 和 subnet_172_16_101_0 之间是可以路由的。
![](https://app.yinxiang.com/shard/s4/res/2a45544f-784a-4bfb-85aa-9b78b6840c4d.jpg)
分析到这里,我们已经搞清楚 router_100_101 是如何打通 vlan100 和 vlan 101 了。
但这里有一个关键问题需要进一步分析:
为什么要把 router_100_101 放到 namespace 中?