在上一节中介绍了 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
查看 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 数据。
Host-A 向 Host-B 发送数据时,Host-B 的 MAC 和 IP 作为数据包的目标 MAC 和 IP,Host-A 的 MAC 作为数据包的源 MAC 和 IP,然后通过 VTEP-1 将数据发送出去。
VTEP-1 从自己维护的映射表中找到 MAC-B 对应的 VTEP-2,然后执行 VXLAN 封装,加上 VXLAN 头,UDP 头,以及外层 IP 和 MAC 头。此时的外层 IP 头,目标地址为 VTEP-2 的 IP,源地址为 VTEP-1 的 IP。同时由于下一跳是 Router-1,所以外层 MAC 头中目标地址为 Router-1 的 MAC。
数据包从 VTEP-1 发送出去后,外部网络的路由器会依据外层 IP 头进行包路由,最后到达与 VTEP-2 连接的路由器 Router-2。
Router-2 将数据包发送给 VTEP-2。VTEP-2 负责解封数据包,依次去掉外层 MAC 头,外层 IP 头,UDP 头 和 VXLAN 头。
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 能够更新相关信息,从而避免不必要的隧道连接和广播。