第272篇:OpenStack Neutron 网络:Provider 与 Self-Service

关键词:OpenStack、Neutron、Provider网络、Self-Service网络、扁平网络、VLAN网络、网络插件


一、引言

OpenStack Neutron(原Nova Network的独立项目)是OpenStack平台的网络服务组件,为计算实例(VM)提供"网络即服务"(Networking as a Service)能力。Neutron通过抽象网络资源,使得用户能够按需创建和管理虚拟网络。

Neutron支持两种基本网络类型:Provider网络和Self-Service网络。理解这两种网络的区别和适用场景,是设计和部署OpenStack云平台网络的基础。

二、核心概念

2.1 Provider 网络

Provider网络是由云管理员预先创建的网络,直接映射到底层物理网络基础设施:

特点: - 由云管理员创建和管理 - 租户只能使用,不能修改网络配置 - 直接映射到物理网络的VLAN或物理网络 - 租户的VM可以直接获取物理网络的IP地址

网络类型:

类型 说明 隔离方式
flat 扁平网络,无VLAN标签 无隔离(所有VM在同一广播域)
vlan VLAN网络,带VLAN标签 VLAN隔离
gre GRE隧道网络 GRE隧道隔离
vxlan VXLAN隧道网络 VNI隔离

2.2 Self-Service 网络

Self-Service网络是由租户自主创建和管理的虚拟网络:

特点: - 租户通过Neutron API自主创建 - 租户可以配置子网、路由器、安全组等 - 通过Neutron Router实现租户网络与外部网络的连接 - 提供完整的三层网络能力

Self-Service 网络 - 图示

2.3 Neutron 网络插件

Neutron通过插件架构支持多种网络后端:

插件 说明 网络类型
Open vSwitch(OVS) 基于OVS的虚拟网络 VLAN/VXLAN/GRE
Linux Bridge 基于Linux Bridge VLAN/Flat
ML2 多层插件(通用) 多种后端
VLAN VLAN网络 VLAN
SR-IOV 单根I/O虚拟化 直通物理网卡

三、技术细节

3.1 Provider 网络创建

VLAN Provider网络创建:

# 创建VLAN物理网络
openstack network create --provider-physical-network physnet1 \
    --provider-network-type vlan \
    --provider-segment-id 100 \
    --external \
    provider-vlan-100

# 创建子网
openstack subnet create --network provider-vlan-100 \
    --subnet-range 192.168.100.0/24 \
    --gateway 192.168.100.1 \
    --dns-nameserver 8.8.8.8 \
    provider-subnet-100

Flat Provider网络创建:

# 创建扁平网络(无VLAN标签)
openstack network create --provider-physical-network physnet1 \
    --provider-network-type flat \
    provider-flat-net

# 创建子网
openstack subnet create --network provider-flat-net \
    --subnet-range 10.0.0.0/24 \
    --gateway 10.0.0.1 \
    provider-flat-subnet

3.2 Self-Service 网络创建

# 1. 租户创建私有网络(VXLAN)
openstack network create tenant-private-net

# 2. 创建子网
openstack subnet create --network tenant-private-net \
    --subnet-range 192.168.1.0/24 \
    --gateway 192.168.1.1 \
    --dns-nameserver 8.8.8.8 \
    tenant-subnet-1

# 3. 创建路由器
openstack router create tenant-router

# 4. 添加路由器接口(连接私有子网)
openstack router set --subnet tenant-subnet-1 tenant-router

# 5. 添加外部网络接口
openstack router set --external-gateway provider-vlan-100 tenant-router

# 6. 启动DHCP服务
openstack network set --enable-dhcp tenant-private-net

3.3 Neutron Router 工作原理

Neutron Router是实现租户网络与外部网络三层路由的关键组件:

Neutron Router 工作原理 - 图示

3.4 DVR(分布式虚拟路由器)

传统L3 Agent将路由器集中部署在一台物理主机上,存在单点故障和带宽瓶颈。DVR将路由器功能分布式部署到所有计算节点:

DVR(分布式虚拟路由器) - 图示

DVR架构组件:

组件 角色 部署位置
Internal L3 Agent 处理东西向流量和SNAT 所有计算节点
FIP Agent 处理浮动IP和南北向流量 计算节点(轮询)
DVR Ha Agent 路由器高可用(Keepalived) 计算节点(3副本)

DVR vs 集中式路由对比:

维度 集中式路由 DVR分布式路由
单点故障 是(L3 Agent宕机=全网中断) 否(分布式冗余)
东西向流量路径 VM→L3 Agent→VM(绕行) VM→VM(本地直连)
南北向流量路径 经L3 Agent所在节点 本地节点直连外部
带宽瓶颈 L3 Agent所在节点 分散到所有节点
配置复杂度 低 中(需额外配置DVR)
适用规模 小型环境(<50节点) 中大型环境(>50节点)

3.5 L3 高可用(HA)

Neutron支持L3路由器的高可用部署,通过Keepalived协议实现主备切换:

HA特性 说明 配置参数
主备选举 基于Keepalived的VRRP协议 ha_true=True
心跳检测 L3 Agent间心跳报文 heartbeat_interval=10s
故障切换 主节点故障后自动切换 failover_timer=5s
副本数 默认3副本(1主2备) ha_chosen_hosts=3
状态同步 主备间路由表同步 ip_propagation_method=notify

L3 HA配置:

# /etc/neutron/l3_agent.ini
[DEFAULT]
ha_true = True
availability_zone = nova
# 指定HA副本数
max_l3_agents_per_router = 3
min_l3_agents_per_router = 1

3.6 Neutron QoS 服务

Neutron QoS提供带宽管理功能,限制租户网络的带宽:

# 1. 创建QoS策略
openstack qos policy create tenant-qos-policy

# 2. 添加带宽限制规则(下行100Mbps,上行50Mbps)
openstack qos rule create --type minimum-bandwidth \
    --value 50 --unit mbits\/sec tenant-qos-policy
openstack qos rule create --type maximum-bandwidth \
    --value 100 --unit mbits\/sec tenant-qos-policy

# 3. 将QoS策略绑定到网络
openstack network set --qos-policy tenant-qos-policy tenant-net
QoS规则类型 说明 参数
minimum-bandwidth 最小带宽保障 value(unit:mbits/sec)
maximum-bandwidth 最大带宽限制 value(unit:mbits/sec)
dscp-marking DSCP标记 dscp value(0-63)
minimum-egress-bandwidth 最小出向带宽 value(unit:mbits/sec)
maximum-egress-bandwidth 最大出向带宽 value(unit:mbits/sec)

四、实战配置/案例分析

4.1 ML2 + OVS 插件配置

# /etc/neutron/plugins/ml2/ml2_conf.ini
[ml2]
type_drivers = flat,vlan,vxlan
tenant_network_types = vxlan
mechanism_drivers = openvswitch
extension_drivers = port_security

[ml2_type_flat]
flat_networks = physnet1,physnet2

[ml2_type_vlan]
network_vlan_ranges = physnet1:100:200,physnet2:300:400

[ml2_type_vxlan]
vni_ranges = 1000:2000

[securitygroup]
enable_ipset = True

# /etc/neutron/plugins/ml2/openvswitch_agent.ini
[ovs]
local_ip = 10.0.0.11
bridge_mappings = physnet1:br-phys1,physnet2:br-phys2

[l3]
enable_dvr = False

4.2 故障案例:Neutron DHCP Agent 异常导致VM无法获取IP

现象:租户创建的VM无法获取IP地址,日志显示DHCP REQUEST超时。

排查过程:

# 1. 检查DHCP Agent状态
openstack network agent list
# DHCP Agent状态为down

# 2. 检查DHCP Agent日志
tail -f /var/log/neutron/dhcp_agent.log
# 错误: Failed to create dhclient lease for port xxx

# 3. 检查OVS流表
ovs-ofctl dump-flows br-int
# 发现DHCP报文的流表项缺失

# 4. 检查metalloc库(dhclient)
systemctl status neutron-dhcp-agent
# dhcp-agent进程crash, 元因为dnsmasq配置冲突

根因:宿主机上已安装了dnsmasq服务(用于其他用途),端口67(DHCP)被占用,导致Neutron DHCP Agent无法启动内部的dnsmasq进程。

解决: 1. 停止并禁用系统dnsmasq服务 2. 重启Neutron DHCP Agent 3. 验证VM能够正常获取IP地址 4. 建议在部署文档中明确标注端口冲突检查项

4.3 故障案例:Self-Service网络无法访问外部

现象:租户VM可以互相通信,但无法访问外部网络(互联网)。

排查过程:

# 1. 检查VM路由表
ip route show
# 默认网关正确指向Neutron Router

# 2. 检查Router状态
openstack router show tenant-router
# Router状态为UP, 接口正常

# 3. 检查L3 Agent
openstack network agent list
# L3 Agent状态正常

# 4. 检查SNAT规则
# 在L3 Agent所在节点上:
ip netns exec qrouter-xxx iptables -t nat -L POSTROUTING -n
# SNAT规则缺失!

# 5. 检查外部网络配置
openstack network show provider-vlan-100
# 外部网络没有标记为--external

根因:Provider网络创建时忘记添加--external标志,导致Neutron Router无法将其识别为外部网络,SNAT规则未生成。

解决: 1. 将Provider网络标记为外部网络:

openstack network set --external provider-vlan-100
  1. 重新关联Router的外部网关:
openstack router set --external-gateway provider-vlan-100 tenant-router

五、总结

网络类型 创建者 管理权限 适用场景
Provider Flat 管理员 只读 简单环境, 无隔离需求
Provider VLAN 管理员 只读 需要VLAN隔离的租户
Self-Service VXLAN 租户 完全控制 多租户云环境
Self-Service GRE 租户 完全控制 不支持VXLAN的环境
Neutron组件 功能
L2 Agent 管理OVS/Linux Bridge, 处理二层转发
L3 Agent 管理路由器, NAT, DHCP路由
DHCP Agent 管理dnsmasq, 提供DHCP服务
Metadata Agent 提供实例元数据服务
Security Group 管理安全组规则(Firewall)
DVR 分布式虚拟路由, 消除单点故障
L3 HA 路由器主备高可用
QoS 带宽管理与限速

思考

  1. Provider网络与Self-Service网络的核心区别是什么?在什么场景下必须使用Provider网络?
  2. Neutron Router本质上是一个运行在命名空间中的Linux路由器,它的性能瓶颈在哪里?
  3. 如果租户的Self-Service网络需要与外部BGP路由器交换路由,Neutron如何支持这一需求?
  4. DVR模式下,东西向流量和南北向流量分别走什么路径?与集中式路由相比延迟有何变化?
  5. Neutron QoS的带宽限制在底层是如何实现的?OVS流表和Linux tc是如何配合的?

下篇预告:第273篇:虚拟网络:VPC、子网、安全组、ACL