玩转 OpenStack(八.2)Linux Bridge 实现 Neutron 网络之Router、VXLAN

在上一节中介绍了 Local Network、Flat Network、VLAN Network 和 DHCP 服务。以及他们在测试环境中的实际情况。

本节将继续介绍 OpenStack 的其他网络类型,Routing 和 VXLAN

一、Routing

路由服务提供跨 subnet 互联互通功能。

在上一节的 VLAN Network 中创建了两个 VLAN:
test-vlan-100 192.168.16.0/24
test-vlan-101 192.168.26.0/24

两台 Instance 分别加入 VLAN100 和 VLAN101。


这两个 Instance 要通信必须借助 router,这个 router 可以是物理 router 或者虚拟 router。

1. 虚拟 router

L3 Agent 会在控制节点或者网络节点上运行虚拟 router,为 subnet 提供路由服务。

* 配置 L3 Agent

配置文件 /etc/neutron/l3_agent.ini

[DEFAULT]
external_network_bridge =
interface_driver = linuxbridge
ovs_use_veth = False
debug = True

查看 agent 运行情况

root@controller:~# source /opt/stack/devstack/openrc admin admin
root@controller:~# neutron agent-list
neutron CLI is deprecated and will be removed in the future. Use openstack CLI instead.
+-----------------------+--------------------+------------+-------------------+-------+----------------+-----------------------+
| id                    | agent_type         | host       | availability_zone | alive | admin_state_up | binary                |
+-----------------------+--------------------+------------+-------------------+-------+----------------+-----------------------+
| 0f0901db-dd80-4f79-81 | Linux bridge agent | compute    |                   | :-)   | True           | neutron-linuxbridge-  |
| 65-f1dbe32eb884       |                    |            |                   |       |                | agent                 |
| 3c5058ab-ea53-44fe-   | Linux bridge agent | controller |                   | :-)   | True           | neutron-linuxbridge-  |
| 98d1-998bddf1d269     |                    |            |                   |       |                | agent                 |
| 6f469203-717c-4b96-93 | Metadata agent     | controller |                   | :-)   | True           | neutron-metadata-     |
| 65-d044936c542c       |                    |            |                   |       |                | agent                 |
| 6f7bc4ca-6023-4613    | DHCP agent         | controller | nova              | :-)   | True           | neutron-dhcp-agent    |
| -979b-6e06420763d0    |                    |            |                   |       |                |                       |
| ea906b28-db14-484c-   | L3 agent           | controller | nova              | :-)   | True           | neutron-l3-agent      |
| a3e3-37ea0698d7d4     |                    |            |                   |       |                |                       |
+-----------------------+--------------------+------------+-------------------+-------+----------------+-----------------------+
* 创建 router

创建 router


给 router 添加两个接口


在虚拟机 test_vlan3 尝试 ping valn-test2 发现可以 ping 通

查看 route

* 底层变化

查看 brctl

root@controller:~# brctl show
bridge name bridge id       STP enabled interfaces
br-ex       8000.000000000000   no
brq2b85ebb9-a6      8000.000c2945542f   no      ens35.100
                            tap0e13c0a5-3c
                            tap16284e31-78
                            tapf85d61d8-c3
brqded938ea-60      8000.000c2945542f   no      ens35.101
                            tap1a862bc1-b9
                            tap88d7a622-24

可以看到多出来两个 tap tap16284e31-78 tap1a862bc1-b9 分别对应 router 上的两个接口名

* 当前网络结构如下
* 查看router 创建的两个 TAP 设备并没有配置相应的 Gateway IP
tap16284e31-78 Link encap:Ethernet  HWaddr c6:44:26:43:37:30
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:22 errors:0 dropped:0 overruns:0 frame:0
          TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1510 (1.5 KB)  TX bytes:604 (604.0 B)

tap1a862bc1-b9 Link encap:Ethernet  HWaddr 46:cd:ad:23:f7:d5
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:30 errors:0 dropped:0 overruns:0 frame:0
          TX packets:18 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:2260 (2.2 KB)  TX bytes:1159 (1.1 KB)

因为 L3 Agent 会为每个 router 创建一个 namespace,通过 veth pair 与 TAP 相连,然后将 Gateway IP 配置在位于 namespace 里面的 veth Interface 上,这样就能提供路由了。

* 使用 ip netns 查看 namespace
root@controller:~# neutron router-list
neutron CLI is deprecated and will be removed in the future. Use openstack CLI instead.
+---------------------------+------------------------+---------------------------+-----------------------+-------------+-------+
| id                        | name                   | tenant_id                 | external_gateway_info | distributed | ha    |
+---------------------------+------------------------+---------------------------+-----------------------+-------------+-------+
| 4de6a512-01ed-4184-a12f-  | router_valn100_vlan101 | b25eb8ed9c804fc79ea248ec1 | null                  | False       | False |
| 095a3e26cf26              |                        | 05df93c                   |                       |             |       |
+---------------------------+------------------------+---------------------------+-----------------------+-------------+-------+

root@controller:~# ip netns
qrouter-4de6a512-01ed-4184-a12f-095a3e26cf26 (id: 0)
qdhcp-ded938ea-60fa-4a7d-8a3f-9bd9947ae25f (id: 3)
qdhcp-2b85ebb9-a6d4-45de-bba2-24896b4ab274 (id: 2)

使用 ip netns exec ip a 查看 veth Interface 配置

root@controller:~# ip netns exec qrouter-4de6a512-01ed-4184-a12f-095a3e26cf26 ip a
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: qr-16284e31-78@if47:  mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether fa:16:3e:8f:03:6c brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.16.1/24 brd 192.168.16.255 scope global qr-16284e31-78
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fe8f:36c/64 scope link
       valid_lft forever preferred_lft forever
3: qr-1a862bc1-b9@if48:  mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether fa:16:3e:db:a2:d1 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.26.1/24 brd 192.168.26.255 scope global qr-1a862bc1-b9
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fedb:a2d1/64 scope link
       valid_lft forever preferred_lft forever

namespace 中有两个 Interface:

  • qr-16284e31-78 上设置了 Gateway IP 192.168.16.1,与 root namespace 中的 tap16284e31-78 组成 veth pair
  • qr-1a862bc1-b9 上设置了 Gateway IP 192.168.26.1,如 root namespace 中的 tap1a862bc1-b9 组成 veth pair

网络结构如下


namespace 中的路由表也保证了 test-vlan-100 和 test-vlan-101 之间使可以路由的,如下

root@controller:~# ip netns exec qrouter-4de6a512-01ed-4184-a12f-095a3e26cf26 route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.16.0    *               255.255.255.0   U     0      0        0 qr-16284e31-78
192.168.26.0    *               255.255.255.0   U     0      0        0 qr-1a862bc1-b9

二、VXLAN

VXLAN 全称 Virtual Extensible Local Area Network。VXLAN 提供与 VLAN 相同的以太网二层服务。

1. 优势

  • 支持更多的二层网段
    VLAN 使用 12-bit 标记 VLAN ID,最多支持 4096 个 VLAN,VXLAN 使用 24-bit 标记 VXLAN ID,最多支持 16777216 个。

  • 能更好的利用已有的网络路径。
    VLAN 使用 Spanning Tree Protocol 避免环路,这会导致有一半的网络路径被 block 掉。VXLAN 的数据包是封装到 UDP 通过三层传输和转发的,可以使用所有的路径。

  • 避免物理交换机 MAC 表耗尽
    由于采用隧道机制,TOR(TOP on Rack)交换机无须在 MAC 表中记录虚拟机的信息。

2. VXLAN 封装和包格式

VXLAN 是将二层建立在三层上的网络。通过将二层数据封装到 UDP 的方式来扩展数据中心的二层网段数量。
VXLAN 定义了一个 MAC-in-UDP 的封装格式。在原始的 Layer 2 网络包前加上 VXLAN Header,然后放到 UDP 和 IP 包中。通过 MAC-in-UDP 封装,VXLAN 能够在 Layer 3 网络上建立一条 Layer 2 的隧道。

3. VXLAN Tunnel EndPoint

VXLAN 使用 VXLAN Tunnel Endpoint(VTEP)设备处理 VXLAN 的封装和解封。
每个 VTEP 有一个 IP Interface,配置了一个 IP 地址。VTEP 使用该 IP 封装 Layer 2 frame,并通过该 IP Interface 传输和接收封装后的 VXLAN 数据包。

4. VXLAN 包转发流

VXLAN 在 VTEP 间建立隧道,通过 Layer 3 网络传输封装后的 Layer 2 数据。

  1. Host-A 向 Host-B 发送数据时,Host-B 的 MAC 和 IP 作为数据包的目标 MAC 和 IP,Host-A 的 MAC 作为数据包的源 MAC 和 IP,然后通过 VTEP-1 将数据发送出去。

  2. VTEP-1 从自己维护的映射表中找到 MAC-B 对应的 VTEP-2,然后执行 VXLAN 封装,加上 VXLAN 头,UDP 头,以及外层 IP 和 MAC 头。此时的外层 IP 头,目标地址为 VTEP-2 的 IP,源地址为 VTEP-1 的 IP。同时由于下一跳是 Router-1,所以外层 MAC 头中目标地址为 Router-1 的 MAC。

  3. 数据包从 VTEP-1 发送出去后,外部网络的路由器会依据外层 IP 头进行包路由,最后到达与 VTEP-2 连接的路由器 Router-2。

  4. Router-2 将数据包发送给 VTEP-2。VTEP-2 负责解封数据包,依次去掉外层 MAC 头,外层 IP 头,UDP 头 和 VXLAN 头。

  5. VTEP-2 依据目标 MAC 地址将数据包发送给 Host-B。

5. 配置

配置文件 /etc/neutron/plugins/ml2/ml2_conf.ini

[ml2]
tenant_network_types = vxlan
extension_drivers = port_security
mechanism_drivers = openvswitch,linuxbridge

[ml2_type_geneve]
vni_ranges = 1:1000

[vxlan]
local_ip = 172.16.245.138
enable_vxlan = True

tenant_network_types 普通用户创建的网络类型为 VXLAN
vni_ranges 指定 VXLAN 的范围
local_ip 指定 VTEP 的 IP 地址

5. 创建 VXLAN

绑定子网



6. 底层变化

root@controller:~# brctl show
bridge name             bridge id       STP enabled        interfaces
brqc6be1e75-a8      8000.1a56041da633   no              tapf41de604-d4
                                                          vxlan-100

Neutron 创建了

  • vxlan 100 对应的网桥 brqc6be1e75-a8
    [图片上传中...(屏幕快照 2019-04-14 下午2.49.06.png-b5ca12-1555224554638-0)]
  • vxlan Interface vxlan-100
  • dhcp 的 tap 设备 tapf41de604-d4

查看 vxlan Interface 的详细配置

root@controller:~# ip -d link show dev vxlan-100
50: vxlan-100:  mtu 1450 qdisc noqueue master brqc6be1e75-a8 state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether 1a:56:04:1d:a6:33 brd ff:ff:ff:ff:ff:ff promiscuity 1
    vxlan id 100 group 224.0.0.1 dev ens35 srcport 0 0 dstport 8472 ageing 300
    bridge_slave state forwarding priority 32 cost 100 hairpin off guard off root_block off fastleave off learning on flood on addrgenmode eui64

7. 创建 Instance 并连入 vxlan100

当前网桥状态

root@compute:~# brctl show
bridge name           bridge id     STP enabled     interfaces
brqc6be1e75-a8      8000.a68bc1fe0af0   no      tap4484a47b-b6
                                                tapf41de604-d4
                                                    vxlan-100

当前 vxlan100 的结构图


在创建一台 Instance。两台 Instance 分别在 控制节点和计算节点
vxlan100 的结构图如下


三、L2 Population

L2 Population 是用来提高 VXLAN 网络的 Scalability 的

1. 作用

如图:5 个节点的 VXLAN 网络,每个节点上运行若干个 vm

假设 Host A 上的 VM 1 想要与 Host D 上的 VM 7 通信,VM 1 首先要获取 VM 7 的 MAC 地址。
于是 VM 1 需要在整个 VXLAN 网络中广播 ARP 报文。如下图


如果 VXLAN 网络的节点很多,上面广播的成本就会很大,这样 Scalability 就成问题了。

这时 L2 Population 出现。如下图


L2 Population 的作用是在 VTEP 上提供 Proxy ARP 功能,使得 VTEP 能预先获取 VXLAN 网络中的信息:

  • VM IP - MAC 对应关系
  • VM - VTEP 对应关系

当 VM 1 与 VM 7 通信时:

  • Host A 上的 VTEP 直接响应 VM 1 的 ARP 请求,告知 VM 7 的 MAC 地址
  • 因为 Host A 上的 VTEP 知道 VM 7 位于 Host D 上,会将封装好的 VXLAN 数据包直接发送给 Host D 的 VTEP

2. 存储原理

Neutron 中保存每个 port 的状态,而 port 保存了 IP,MAC 相关数据。

Instance 启动时,其 port 状态会从 down 到 build 刀 active。

因此。每次 port 发生变化时,Neutron 都会通过 RPC 消息通知各节点上的 Neutron agent,使得 VTEP 能够更新相关信息,从而避免不必要的隧道连接和广播。

你可能感兴趣的:(玩转 OpenStack(八.2)Linux Bridge 实现 Neutron 网络之Router、VXLAN)