Neutron网络核心机制详解
Neutron 深入浅出解析
Neutron 是 OpenStack 云平台中负责网络即服务(NaaS)的核心组件。它取代了早期 Nova-Network 的简单网络模型,为租户提供了丰富的、可编程的虚拟网络功能,实现了对网络拓扑的灵活定义和管理 。
一、 核心概念
理解 Neutron 前,需掌握其定义的几个核心资源对象:
| 概念 | 描述 | 类比 |
|---|---|---|
| Network | 一个隔离的、虚拟的二层广播域。它是子网和端口的容器。 | 一个独立的虚拟交换机或 VLAN。 |
| Subnet | 一个 IPv4 或 IPv6 地址块。它定义了网络地址空间、网关和 DNS 等配置,必须关联到一个 Network。 | 一个 IP 网段,如 ` |
| 192.168.1.0/24`。 | ||
| Port | 虚拟网络交换机上的一个虚拟端口。它代表一个虚拟网络接口卡(vNIC),可以被连接到虚拟机或其它网络设备(如路由器),并拥有一个或多个 IP 地址。 | 交换机上的一个网口,插着虚拟机的网线。 |
| Router | 一个虚拟的三层路由器,用于在不同子网或网络之间转发流量,并提供外部网络(如公网)的接入能力。 | 一台虚拟路由器。 |
二、 架构与组件
Neutron 采用插件化、松耦合的架构,分为控制平面和数据平面,具有良好的可扩展性 。
1. 控制平面
负责接收、验证 API 请求,并将网络配置信息持久化到数据库中。核心是 neutron-server 进程。
- API 层: 提供 RESTful API,接收用户对网络、子网、端口、路由器等资源的创建、查询、更新、删除(CRUD)请求。
- 插件层 (Plugin): 是 Neutron 的核心扩展点。它处理 API 请求的业务逻辑,并将抽象的网络配置转换为具体后端技术能理解的模型。最常用的是 ML2 (Modular Layer 2) 插件,它通过驱动(Driver)机制支持多种网络技术(如 VLAN, VXLAN, GRE)和多种虚拟交换机(如 Linux Bridge, Open vSwitch)。
- 数据库: 存储所有 Neutron 管理的网络资源状态和配置信息。
2. 数据平面
负责在计算节点和网络节点上执行具体的网络配置,实现数据包的转发、隔离、路由等功能。由运行在各节点上的 Agent(代理) 实现。
- L2 Agent (二层代理): 在每个计算节点和网络节点上运行,负责根据控制平面的指令配置本地的虚拟交换机(如
openvswitch-agent或linuxbridge-agent),创建网桥、端口、VLAN/VXLAN 隧道等 。 - L3 Agent (三层代理): 通常运行在专用的网络节点上。它负责创建和管理虚拟路由器(Router),在 Linux Network Namespace 中运行,实现子网间路由、浮动 IP(Floating IP)和 SNAT/DNAT 功能 。
- DHCP Agent (DHCP 代理): 为虚拟网络提供 DHCP 服务。它会为每个需要 DHCP 服务的网络创建一个独立的 Network Namespace,并在其中运行
dnsmasq进程,为虚拟机自动分配 IP 地址 。 - 元数据代理 (Metadata Agent): 为虚拟机提供访问 OpenStack 元数据服务(如获取 SSH 公钥、用户数据等)的通道。
控制平面与数据平面之间通过 消息队列 (如 RabbitMQ) 进行异步通信。neutron-server 将需要执行的任务(如创建端口)放入队列,相应的 Agent 从队列中取出任务并执行,然后将执行结果反馈回去 。
三、 工作流程示例:创建一个 VXLAN 网络并启动虚拟机
以下流程结合了架构中各组件的协作 :
- 用户发起请求: 租户通过 Horizon 面板或 CLI 命令请求创建一个 VXLAN 类型的网络
net1和一个子网subnet1。 - 控制平面处理:
neutron-server的 API 层接收请求。- ML2 插件校验请求,并将网络配置(类型为 VXLAN,分配一个 VNI)写入数据库。
- ML2 插件通过消息队列,向所有相关的计算节点和网络节点的
openvswitch-agent发送“创建网络net1”的 RPC 消息。
- 数据平面执行:
- 各节点的
openvswitch-agent收到消息后,在本地的 OVS 中创建一个新的网桥(如br-int上关联一个新的 VXLAN 端口),并建立到其他节点的 VXLAN 隧道。 - 如果子网开启了 DHCP,Neutron 会调度一个
dhcp-agent。该 Agent 会创建一个名为dhcp-<network-id>的 Network Namespace,在其中启动dnsmasq服务,并配置好 IP 地址和路由 。
- 各节点的
- 启动虚拟机:
- 用户通过 Nova 启动一个虚拟机,并指定其连接到
net1。 - Nova 向 Neutron 请求为虚拟机分配一个端口。
- Neutron 在数据库中创建端口记录,分配 MAC 和 IP 地址,并通过消息队列通知计算节点上的
openvswitch-agent。 - 该 Agent 在 OVS 网桥上创建虚拟端口(
tap设备),并将其与虚拟机的虚拟网卡连接。 - 虚拟机启动后,通过 DHCP(由
dhcp-agent提供)或静态配置获得 IP 地址,即可在net1内通信。
- 用户通过 Nova 启动一个虚拟机,并指定其连接到
四、 网络类型与模型
Neutron 支持多种网络类型以满足不同场景 :
| 网络类型 | 描述 | 适用场景 |
|---|---|---|
| Local | 仅限于单个计算节点内部的网络,无法跨节点通信。 | 测试或特殊隔离需求。 |
| Flat | 无标签的物理网络,直接映射到物理网卡。虚拟机获得的是物理网络的真实 IP。 | 需要虚拟机获得与物理机同网段 IP 的场景。 |
| VLAN | 基于 IEEE 802.1Q 标准的网络,通过 VLAN ID 进行隔离。 | 传统数据中心,需要与现有物理 VLAN 网络集成。 |
| VXLAN/GRE | 基于隧道技术的 overlay 网络。通过封装二层帧在三层 IP 网络上传输,可突破 VLAN 4096 的数量限制。 | 大型云数据中心,需要大规模、多租户网络隔离。 |
Neutron 的网络实现模型主要分为两种:
- 提供商网络 (Provider Network): 由管理员创建,直接映射到底层物理网络基础设施(如特定的物理网卡或 VLAN)。租户通常只能使用,不能创建。
- 租户网络 (Tenant Network): 由租户自己创建和管理的虚拟网络。Neutron 负责其全生命周期管理,租户无需关心底层物理拓扑。上述的 VXLAN 网络就是典型的租户网络。
五、 基本操作示例
以下通过 OpenStack CLI 演示 Neutron(现多使用 openstack network 命令)的基本使用:
# 1. 创建一个租户网络 (VXLAN类型)
openstack network create --share --provider-network-type vxlan tenant_net
# 2. 在网络上创建一个子网
openstack subnet create --network tenant_net \
--subnet-range 10.1.0.0/24 \
--gateway 10.1.0.1 \
--dns-nameserver 8.8.8.8 \
tenant_subnet
# 3. 创建一个路由器
openstack router create my_router
# 4. 将路由器的内部接口连接到子网
openstack router add subnet my_router tenant_subnet
# 5. 设置路由器的外部网关(连接到名为`public`的提供商网络)
openstack router set --external-gateway public my_router
# 6. 启动一个虚拟机并连接到该网络
openstack server create --flavor m1.small \
--image cirros \
--nic net-id=$(openstack network show tenant_net -f value -c id) \
vm1
总结:Neutron 通过其清晰的分层架构(控制平面与数据平面分离)、插件化设计(ML2)和代理模型,将复杂的网络功能抽象为简单的 API,使得云管理员和租户能够像管理计算和存储资源一样,灵活、动态地定义和管理云中的虚拟网络,是构建复杂、多租户云环境网络的基石 。
参考来源
- openstack——Neutron基本架构详解
- OpenStack Neutron 架构详解
- Neutron 项目使用教程
- OpenStack核心组件-neutron
- Neutron原理详解
- Neutron dhcp实现
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)