OpenStack Neutron 中的核心概念:Network、Subnet 和 Port
一、核心概念详解
在传统物理网络中,我们有交换机、VLAN、子网、网卡等概念。Neutron 将这些概念抽象并虚拟化,形成了自己的一套模型。
1. Network
概念:
Network 是一个二层广播域,可以理解为一个虚拟的交换机。连接到同一个 Network 的虚拟机,相当于都接在了同一个交换机上,它们之间可以在二层直接通信。
关键点:
- 隔离性: 默认情况下,不同的 Network 之间是完全隔离的。一个 Network 内的流量不能直接到达另一个 Network,除非通过路由器。
- 类型:
- Provider Network: 由云管理员创建,直接映射到物理网络基础设施(如物理网络的某个 VLAN 或 Flat 网络)。通常用于连接外部网络或提供特定的网络服务。
- Tenant Network: 由普通用户创建,完全虚拟化的网络。Neutron 负责其生命周期管理,用户无需关心底层物理网络细节。根据配置,可以分为:
- Local: 仅限于单个计算节点,不同节点上的 VM 即使在同一 Local Network 也无法通信。
- Flat: 无标签的非 VLAN 网络,所有 VM 都在同一个二层网络中。
- VLAN: 使用 802.1Q VLAN 标签进行隔离,是最常见的类型。
- VXLAN/GRE: 使用 overlay 隧道技术,克服了 VLAN ID 数量(4096)的限制,非常适合大规模云环境。
2. Subnet
概念:
Subnet 是一个三层 IP 地址块,关联在一个 Network 上。它定义了 Network 的 IP 地址范围、网关、DNS 等三层属性。
关键点:
- 关联关系: 一个 Subnet 必须且只能属于一个 Network。但一个 Network 可以有多个 Subnet,这被称为多子网网络。
- 功能:
- IP 地址管理: Neutron 的 DHCP 服务会从 Subnet 的地址池中为虚拟机分配 IP 地址。
- 网关: 指定了该子网访问外部网络的出口。
- DNS: 为虚拟机配置 DNS 服务器。
举例:
一个 Network 就像一个办公大楼,而 Subnet 就像是这栋大楼里的不同楼层,每个楼层有自己独立的房间号范围(IP 地址段)和一个通往楼梯/电梯间的出口(网关)。
3. Port
概念:
Port 是 Network 上的一个虚拟交换机端口。它代表一个虚拟网络接口卡的连接点。当虚拟机的虚拟网卡连接到 Network 时,Neutron 就会创建一个 Port。
关键点:
- 核心属性:
- MAC 地址: 每个 Port 都有一个唯一的 MAC 地址。
- IP 地址: 一个或多个来自关联 Subnet 的 IP 地址会绑定到该 Port。
- 状态: 标识 Port 是否活跃。
- 安全组: 定义了一组防火墙规则,控制进出该 Port 的流量。
- 绑定信息: 记录了该 Port 最终被连接到哪个计算节点的哪个虚拟交换机上(例如,OVS 的某个端口)。
- 实体化: 当 Nova 启动一个虚拟机并为其指定一个网络时,它会在 Neutron 上为该网络创建一个 Port(或使用已存在的 Port),然后将这个 Port 的信息传递给 Hypervisor。Hypervisor 据此创建虚拟网卡并将其“插”入虚拟网络中。
举例:
继续上面的比喻,Port 就是大楼(Network)每个楼层(Subnet)墙壁上的一个网络插座。虚拟机的网线(虚拟网卡)就插在这个插座上。插座上标明了唯一的物理地址(MAC 地址)和分配到的 IP 地址。
二、Port 的实现机制(重点)
Port 的实现是 Neutron 最核心和最复杂的地方,它连接了抽象的网络模型和具体的虚拟化网络数据平面。
1. 创建流程
当 Nova 要启动一个虚拟机并连接到某个网络时,Port 的创建和绑定流程如下:
- Nova API 调用: 用户通过 Nova 启动 VM,指定网络(
--nic port-id=...
或--net-id=...
)。 - Nova 调用 Neutron: Nova 计算服务向 Neutron API 发送请求,创建(或查询)一个 Port。
- Neutron Server 处理:
- Neutron Server 接收到请求,在其数据库中创建 Port 记录,分配 MAC 和 IP 地址。
- 根据 Port 上配置的安全组规则,生成对应的 iptables/Open vSwitch 流表规则(这些规则稍后会被下发)。
- 如果网络配置了 DHCP,Neutron 会通知 DHCP Agent 更新其配置。
- 信息返回 Nova: 创建成功的 Port 信息(包括 MAC, IP, Binding Profile 等)返回给 Nova。
- Nova 调度并通知 Hypervisor: Nova 调度器选择一台计算节点,然后将 VM 的启动信息(包括 Port 的详细信息)传递给该节点上的 Nova-Compute 服务。
- Hypervisor 创建虚拟设备:
- Nova-Compute 驱动 Hypervisor(如 KVM/QEMU)创建虚拟机,并为其创建虚拟网卡。
- 在 Linux Bridge 或 OVS 环境下,会创建一个对应的虚拟设备接口。
- Neutron Agent 进行绑定:
- 计算节点上的 Neutron Agent(如 OVS Agent 或 Linux Bridge Agent)会检测到新的 Port 需要被“插”入虚拟交换机。
- 绑定: Agent 会执行命令,将上一步创建的虚拟设备接口(
tapXXXX
或vnetX
)连接到对应的虚拟交换机(br-int
)上,并应用之前生成的安全组和网络策略规则。
至此,一个逻辑上的 Port 在物理(计算节点)上完成了实体化。
2. 数据平面实现
Port 的具体实现依赖于 Neutron 使用的底层插件和代理。
以 Open vSwitch 为例:
- 虚拟交换机: 每个计算节点上有一个集成桥
br-int
。 - Port 的实体: 当虚拟机启动时,Hypervisor 会创建一个
tap
设备(例如tap12345678-ab
)。这个tap
设备的一端在宿主机的网络命名空间中,另一端作为虚拟机的虚拟网卡。 - 连接: Neutron OVS Agent 会将这个
tap
设备作为端口添加到br-int
上。这个 OVS 端口就是 Neutron Port 在数据平面的具体体现。 - 流表与安全组: OVS Agent 会在
br-int
上设置流表规则,这些规则实现了安全组(如丢弃非法流量)和网络隔离(如 VLAN 标签的添加和剥离)。
以 Linux Bridge 为例:
- 虚拟交换机: 每个计算节点上有一个 Linux Bridge(例如
brqXXXX
)。 - Port 的实体: 同样会创建一个
tap
设备。 - 连接: 通过
brctl addif
命令将tap
设备加入到对应的 Linux Bridge 中。这个在 Bridge 上的tap
接口就是 Port 的实体。 - 安全组: 安全组通常通过
iptables
规则在tap
设备上实现。
3. 高级特性与 Port
Port 是实现 Neutron 高级网络功能的基础:
- 允许地址对: 允许一个 Port 拥有多个 IP 地址,常用于负载均衡或高可用场景。
- 端口安全: 控制哪些 MAC 和 IP 地址可以通过该 Port 进行通信。
- VNIC 类型: 除了普通的
virtio
,还支持 SR-IOV 的direct
类型。对于 SR-IOV,Port 的创建会直接绑定到物理网卡上的一个 VF,从而实现近乎原生性能的网络。 - 绑定主机: 管理员可以将 Port 固定绑定到特定主机,这对于需要特定物理位置的服务(如 DVR 中的路由器命名空间)至关重要。
总结
概念 | 抽象层级 | 功能 | 物理类比 |
---|---|---|---|
Network | L2 | 定义二层广播域和隔离 | 交换机 |
Subnet | L3 | 定义IP地址段、网关、DNS | 子网/IP网段 |
Port | L1/L2 | 虚拟网络的接入点,承载MAC/IP,应用安全策略 | 交换机端口/网络插座 |
Port 的实现精髓在于:
它是一个连接 Neutron 控制平面(API、数据库)和数据平面(OVS、Linux Bridge、iptables)的纽带。Neutron Server 在逻辑上定义 Port 的所有属性,而各个计算节点上的 Neutron Agent 则负责将这些属性“翻译”并应用到具体的网络设备上,从而将一个抽象的“端口”概念,变成了一个实实在在可以转发网络数据包的接口。