Neutron 深度解析:OpenStack SDN 网络服务原理与实践

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
# 查看 br-int 流表
ovs-ofctl dump-flows br-int

# 典型流表条目
# table=0: 入口分类
cookie=0x0, priority=1,in_port=1 actions=resubmit(,2)

# table=2: 安全组处理(conntrack)
cookie=0x0, priority=1,ct_state=-trk actions=ct(table=3)

# table=60: 出口转发
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
# 查看路由器 namespace
ip netns list | grep qrouter
# qrouter-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

# 进入 namespace 查看路由
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
# neutron/agent/dhcp/agent.py

class DhcpAgent:
def _process_network(self, network):
# 为每个网络创建独立的 dnsmasq 进程
# 在独立的 network namespace 中运行
self.driver.enable_dhcp_helper(network.id)

# 每个网络对应一个 namespace
# qdhcp-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
1
2
3
4
5
6
7
8
# 查看 DHCP namespace 中的 dnsmasq 进程
ip netns exec qdhcp-xxx ps aux | grep dnsmasq

# dnsmasq 配置文件位置
/var/lib/neutron/dhcp/<network-id>/
├── host # MAC → IP 映射
├── opts # DHCP 选项(网关、DNS)
└── 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/ # REST API(基于 Flask)
├── plugins/ml2/ # ML2 核心插件
│ ├── drivers/type/ # VLAN/VXLAN/GRE 类型驱动
│ └── drivers/mech/ # OVS/OVN 机制驱动
├── agent/
│ ├── dhcp/ # DHCP Agent
│ ├── l3/ # L3 Agent(路由/浮动IP)
│ └── ovs/ # OVS Agent(流表配置)
├── db/ # 数据库模型
└── services/
└── loadbalancer/ # LBaaS

生产常见问题排查

网络不通排查流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 1. 检查安全组规则
openstack security group rule list <sg-id>

# 2. 检查端口状态
openstack port show <port-id>

# 3. 检查 OVS 流表
ovs-ofctl dump-flows br-int | grep <mac>

# 4. 检查 ARP 表
ip netns exec qrouter-xxx arp -n

# 5. 抓包定位
ip netns exec qrouter-xxx tcpdump -i qr-xxx -n icmp

浮动 IP 不通

1
2
3
4
5
# 检查 NAT 规则
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 告警