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-agentlinuxbridge-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 网络并启动虚拟机

以下流程结合了架构中各组件的协作 :

  1. 用户发起请求: 租户通过 Horizon 面板或 CLI 命令请求创建一个 VXLAN 类型的网络 net1 和一个子网 subnet1
  2. 控制平面处理
    • neutron-server 的 API 层接收请求。
    • ML2 插件校验请求,并将网络配置(类型为 VXLAN,分配一个 VNI)写入数据库。
    • ML2 插件通过消息队列,向所有相关的计算节点和网络节点的 openvswitch-agent 发送“创建网络 net1”的 RPC 消息。
  3. 数据平面执行
    • 各节点的 openvswitch-agent 收到消息后,在本地的 OVS 中创建一个新的网桥(如 br-int 上关联一个新的 VXLAN 端口),并建立到其他节点的 VXLAN 隧道。
    • 如果子网开启了 DHCP,Neutron 会调度一个 dhcp-agent。该 Agent 会创建一个名为 dhcp-<network-id> 的 Network Namespace,在其中启动 dnsmasq 服务,并配置好 IP 地址和路由 。
  4. 启动虚拟机
    • 用户通过 Nova 启动一个虚拟机,并指定其连接到 net1
    • Nova 向 Neutron 请求为虚拟机分配一个端口。
    • Neutron 在数据库中创建端口记录,分配 MAC 和 IP 地址,并通过消息队列通知计算节点上的 openvswitch-agent
    • 该 Agent 在 OVS 网桥上创建虚拟端口(tap 设备),并将其与虚拟机的虚拟网卡连接。
    • 虚拟机启动后,通过 DHCP(由 dhcp-agent 提供)或静态配置获得 IP 地址,即可在 net1 内通信。

四、 网络类型与模型

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,使得云管理员和租户能够像管理计算和存储资源一样,灵活、动态地定义和管理云中的虚拟网络,是构建复杂、多租户云环境网络的基石 。


参考来源

 

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐