Neutron 深度解析:OpenStack SDN 网络服务原理与实践
定位与核心职责
Neutron 是 OpenStack 的网络服务,提供”网络即服务(NaaS)”能力:
- 创建和管理虚拟网络、子网、路由器
- 为虚拟机分配 IP 地址(DHCP)
- 实现安全组(Security Group)防火墙规则
- 提供浮动 IP(Floating IP)实现外网访问
- 支持负载均衡(LBaaS)、VPN(VPNaaS)等高级服务
架构总览
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| neutron-server(API + 插件层) │ ├── Core Plugin(ML2) │ ├── Type Driver(flat/vlan/vxlan/gre) │ └── Mechanism Driver(OVS/LinuxBridge/OVN) │ └── Service Plugin(Router/LBaaS/FWaaS)
消息队列(RabbitMQ) │ ├── neutron-dhcp-agent ← DHCP 服务(dnsmasq) ├── neutron-l3-agent ← 路由器、浮动IP、NAT ├── neutron-metadata-agent ← 元数据代理 └── neutron-openvswitch-agent ← OVS 数据平面配置
|
ML2 插件架构
ML2(Modular Layer 2)是 Neutron 的核心插件,采用驱动分层设计:
1 2 3 4 5 6 7 8 9 10 11
| ML2 Plugin ├── TypeManager(网络类型管理) │ ├── FlatTypeDriver → 无隔离,直接用物理网络 │ ├── VlanTypeDriver → VLAN 隔离(802.1Q) │ ├── VxlanTypeDriver → VXLAN 隧道(UDP 封装,VNI 标识) │ └── GreTypeDriver → GRE 隧道 │ └── MechanismManager(实现机制管理) ├── OVSMechanismDriver → Open vSwitch 实现 ├── OVNMechanismDriver → OVN 实现(新一代,推荐) └── LinuxBridgeMechanismDriver
|
VXLAN 网络隔离原理
1 2 3 4 5 6 7 8 9 10 11
| VM-A (10.0.0.2) VM-B (10.0.0.3) │ │ │ VNI=100 │ VNI=100 ▼ ▼ [OVS br-int] [OVS br-int] │ │ [OVS br-tun] [OVS br-tun] │ │ └──── VXLAN Tunnel ────────┘ UDP:4789, VNI=100 物理网络(Underlay)
|
VXLAN 用 24 位 VNI(Virtual Network Identifier)标识租户网络,理论上支持 1600 万个隔离网络(远超 VLAN 的 4096 个)。
OVS 数据平面深度解析
OVS 网桥结构
1 2 3 4 5 6 7 8 9
| 物理网卡 eth0 │ [br-ex] ← 外部网络桥(连接物理网络) │ [br-tun] ← 隧道桥(VXLAN/GRE 封装/解封装) │ [br-int] ← 集成桥(所有 VM 的虚拟端口都在这里) │ [tap-xxx] ← VM 的虚拟网卡(通过 veth pair 连接)
|
OVS 流表(Flow Table)
OVS 通过 OpenFlow 流表控制数据包转发,这是理解 Neutron 数据平面的关键:
1 2 3 4 5 6 7 8 9 10 11 12 13
| ovs-ofctl dump-flows br-int
cookie=0x0, priority=1,in_port=1 actions=resubmit(,2)
cookie=0x0, priority=1,ct_state=-trk actions=ct(table=3)
cookie=0x0, priority=90,dl_vlan=1,dl_dst=fa:16:3e:xx:xx:xx actions=strip_vlan,output:5
|
安全组实现原理
1 2 3 4 5 6 7 8 9 10
| VM 发出数据包 │ ▼ iptables/nftables(安全组规则) │ ▼ OVS br-int(conntrack 状态跟踪) │ ▼ 转发或丢弃
|
安全组规则最终转化为 iptables 规则(LinuxBridge 模式)或 OVS conntrack 规则(OVS 模式)。
L3 路由与浮动 IP
传统集中式路由(Legacy)
1 2 3 4 5 6 7 8 9 10 11
| VM(10.0.0.2) │ ▼ [qr-xxx] ← 路由器内部接口(在 network namespace 中) │ [Router Namespace] ← 每个虚拟路由器一个 netns │ iptables SNAT/DNAT ▼ [qg-xxx] ← 路由器外部接口 │ 外部网络(192.168.1.0/24)
|
1 2 3 4 5 6
| ip netns list | grep qrouter
ip netns exec qrouter-xxx ip route
|
DVR(分布式虚拟路由)
传统路由所有流量都经过网络节点,DVR 将路由功能下沉到每个计算节点:
1 2 3 4 5 6 7 8 9 10
| 计算节点 1 计算节点 2 ┌─────────────────┐ ┌─────────────────┐ │ VM-A │ │ VM-B │ │ 10.0.0.2 │ │ 10.0.1.2 │ │ │ │ │ │ │ │ [fip namespace] │ │ [fip namespace] │ │ │ 直接出外网 │ │ │ 直接出外网 │ └────┼────────────┘ └────┼────────────┘ │ │ └──────── 物理网络 ───────────┘
|
DVR 优势:
- 东西向流量(VM 间)不经过网络节点
- 浮动 IP 流量直接从计算节点出去
- 消除网络节点单点瓶颈
DHCP 服务
1 2 3 4 5 6 7 8 9 10
|
class DhcpAgent: def _process_network(self, network): self.driver.enable_dhcp_helper(network.id)
|
1 2 3 4 5 6 7 8
| ip netns exec qdhcp-xxx ps aux | grep dnsmasq
/var/lib/neutron/dhcp/<network-id>/ ├── host ├── opts └── leases
|
OVN:下一代网络实现
OVN(Open Virtual Network)是 OVS 项目的子项目,正在逐步替代传统的 Neutron Agent 方案:
1 2 3 4 5
| 传统方案: neutron-server → RabbitMQ → neutron-openvswitch-agent(每节点)
OVN 方案: neutron-server → OVN Northbound DB → ovn-northd → OVN Southbound DB → ovn-controller(每节点)
|
OVN 优势:
- 去掉 RabbitMQ 依赖,用数据库同步替代消息队列
- 控制平面更简洁,故障域更小
- 原生支持 ACL(替代 iptables 安全组),性能更好
源码关键路径
1 2 3 4 5 6 7 8 9 10 11 12
| neutron/ ├── api/v2/ ├── plugins/ml2/ │ ├── drivers/type/ │ └── drivers/mech/ ├── agent/ │ ├── dhcp/ │ ├── l3/ │ └── ovs/ ├── db/ └── services/ └── loadbalancer/
|
生产常见问题排查
网络不通排查流程
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| openstack security group rule list <sg-id>
openstack port show <port-id>
ovs-ofctl dump-flows br-int | grep <mac>
ip netns exec qrouter-xxx arp -n
ip netns exec qrouter-xxx tcpdump -i qr-xxx -n icmp
|
浮动 IP 不通
1 2 3 4 5
| ip netns exec qrouter-xxx iptables -t nat -L -n | grep <floating-ip>
ip netns exec qrouter-xxx ip addr show qg-xxx
|
关键监控指标
| 指标 |
含义 |
告警阈值 |
| neutron_agent_state |
Agent 存活状态 |
== 0 立即告警 |
| neutron_net_count |
网络数量 |
接近配额时告警 |
| neutron_port_count |
端口数量 |
监控增长趋势 |
| OVS flow table size |
流表条目数 |
> 80% 容量告警 |
| RabbitMQ queue depth |
消息积压 |
> 1000 告警 |