1. 项目概述:这不是一份“照着敲就通”的脚本,而是一份Neutron部署的实战解剖报告
我从2013年开始在IDC机房里搭第一套OpenStack Icehouse,那时候Neutron还叫Quantum,文档稀少得像沙漠里的水。十年过去,现在搜“OpenStack Neutron 部署 指南”,首页全是“手把手”“5分钟搞定”“一键脚本”,但真把环境拉起来、跑通第一个租户网络、让虚拟机ping通外网的人,不到三成。为什么?因为Neutron不是个“安装完就能用”的模块——它本质是一套 可插拔的网络服务抽象层 ,底层可以是Linux Bridge、OVS、SR-IOV,上层要对接Nova、Horizon、Keystone,中间还要和物理网络拓扑严丝合缝。你看到的“部署指南”,90%只讲了 apt install neutron-server 这一步,却没告诉你:当 neutron-server 进程启动失败时,日志里那行 Failed to bind port on agent 背后,其实是你的物理交换机ACL策略拦住了VXLAN端口;当你配置完 provider:network_type=flat 却无法分配IP,问题可能出在 /etc/neutron/plugins/ml2/ml2_conf.ini 里 type_drivers 顺序写反了,导致ML2插件根本没加载flat驱动。
这篇内容,就是为那些已经装过3次OpenStack、每次都在Neutron卡住超过48小时的运维和架构师写的。它不教你怎么复制粘贴,而是带你拆开Neutron的“黑盒子”:看它怎么把一个 neutron net-create --provider:network_type vxlan 命令,翻译成内核里的 ip link add br-int type bridge 、OVS里的 ovs-vsctl add-br br-int 、以及物理交换机上的VLAN Trunk配置。你会真正理解 l2population 机制为什么必须配合 openvswitch-agent 的 tunnel_types = vxlan 使用,也会明白 dhcp_agent 和 metadata_agent 之间那个看似简单的HTTP请求,背后依赖的是 neutron.conf 里 metadata_proxy_shared_secret 与 nova.conf 里 neutron.metadata_proxy_shared_secret 的字节级一致。这不是教程,是解剖刀——切开每一层封装,露出裸露的协议、参数和依赖关系。
2. Neutron核心设计逻辑与部署路径选择
2.1 为什么Neutron不能“独立部署”?——理解它的寄生式架构
很多人误以为Neutron是个独立服务,可以单独装、单独启。这是最大的认知陷阱。Neutron本质上是一个 网络能力提供者(Network Provider) ,它自己不创建任何网络资源,所有动作都必须通过Nova触发。举个最典型的例子:当你在Horizon里点“启动虚拟机”,Nova会向Neutron发起三个关键API调用:
-
GET /v2.0/networks?name=private—— 查询租户网络ID -
POST /v2.0/ports—— 创建端口(Port),指定network_id和device_owner=nova:compute -
PUT /v2.0/ports/{port_id}—— 绑定端口到计算节点(binding:host_id=compute01)
这三个调用缺一不可。如果Neutron服务起来了,但Nova没配好 neutron 段,或者 neutron.conf 里 auth_url 指向了错误的Keystone地址,那么虚拟机连“创建端口”这一步都卡死,日志里只会显示 No valid host was found ,根本不会提示“Neutron连接失败”。所以部署Neutron的第一原则是: 它必须作为Nova的配套组件同步规划,而不是事后补装 。
提示:检查Nova是否已正确集成Neutron,最直接的方法是执行
openstack server create --image cirros --flavor m1.tiny --network private test-vm后,立刻查openstack port list --server test-vm。如果返回空,说明Nova根本没调用Neutron创建端口;如果返回端口但状态为DOWN,才是Neutron自身的问题。
2.2 三种主流部署模式的取舍:单节点All-in-One vs 控制/计算分离 vs 分布式高可用
根据你手头的服务器数量和生产要求,Neutron部署有三条明确路径,没有“最好”,只有“最适合”:
-
All-in-One单节点模式 (适合学习/POC):所有Neutron服务(server、plugin、agent)全跑在同一台机器上。优点是调试方便,
journalctl -u neutron-server和journalctl -u openvswitch-agent日志都在一台机器。缺点是网络平面混乱——管理网、数据网、外部网全挤在一块物理网卡上,br-ex和br-int的流量混杂,一旦OVS流表出错,整个节点网络瘫痪。我建议学习者用此模式,但必须强制划分VLAN子接口:ip link add link eth0 name eth0.100 type vlan id 100,再把br-ex绑定到eth0.100,否则后续扩展到多节点时,网络模型完全无法迁移。 -
控制/计算分离模式 (推荐生产起步):控制节点只跑
neutron-server、dhcp-agent、l3-agent、metadata-agent;计算节点只跑openvswitch-agent。这是最经典的分层架构。关键在于 网络平面物理隔离 :控制节点至少需要3块网卡——eth0走管理网(Keystone/Nova通信),eth1走数据网(VXLAN隧道),eth2走外部网(br-ex上联)。计算节点则只需eth0(管理)+eth1(数据)。这种分离让故障域清晰:L3路由出问题,只影响neutron-l3-agent,不影响计算节点的OVS转发。 -
分布式高可用模式 (大型生产):
neutron-server集群(HAProxy+Keepalived)、dhcp-agent跨节点主备、l3-agent启用dvr(Distributed Virtual Router)。这里有个致命细节:dvr模式下,openvswitch-agent必须开启enable_distributed_routing = True,且l3-agent的agent_mode = dvr_snat和dvr要并存。很多指南只写agent_mode = dvr,结果导致SNAT功能丢失,虚拟机能出不能进。实测下来,DVR对OVS版本敏感——必须用OVS 2.11+,低于此版本dvr流表生成有bug,会导致ARP广播风暴。
2.3 插件选型:ML2 + Mechanism Drivers 是唯一现实选择
Neutron早期有OVS、LinuxBridge、NEC等独立插件,现在全部被ML2(Modular Layer 2)统一。ML2本身不干活,它通过 Mechanism Drivers 调用底层驱动。当前生产环境唯一可行的组合是:
- Type Driver :
vxlan(首选)或vlan(传统IDC) - Mechanism Driver :
openvswitch(压倒性主流) - Tenant Network Type :
vxlan(解决VLAN ID 4096上限)
为什么不用 flat ?因为 flat 网络无法隔离租户,所有用户共享同一二层域,安全性和扩展性归零。为什么不用 gre


3584

被折叠的 条评论
为什么被折叠?



