玩转 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 <namespace> ip a 查看 veth Interface 配置

root@controller:~# ip netns exec qrouter-4de6a512-01ed-4184-a12f-095a3e26cf26 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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 能够更新相关信息,从而避免不必要的隧道连接和广播。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,192评论 6 511
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,858评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,517评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,148评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,162评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,905评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,537评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,439评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,956评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,083评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,218评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,899评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,565评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,093评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,201评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,539评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,215评论 2 358

推荐阅读更多精彩内容