在上一节中介绍了 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 数据。
-
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: <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 能够更新相关信息,从而避免不必要的隧道连接和广播。
网友评论