
1. 这不是“装个软件”Neutron手动安装的本质是网络控制平面的精密组装很多人看到“Neutron手动安装”这六个字第一反应是——又一个Linux服务部署教程点开就走。我当年也是这么想的直到在OpenStack Queens版本上连续三天卡在neutron-server启动失败日志里只有一行ERROR neutron.service — Failed to start neutron server连具体报错位置都找不到。后来才明白Neutron根本不是传统意义上的“服务”它是一套分布式网络控制平面的编排系统手动安装的过程本质上是在白纸上用螺丝刀、万用表和电路图把一台能自主调度虚拟网络的“神经中枢”一寸寸搭出来。它的核心价值不在于“能不能跑起来”而在于你是否真正理解了OpenStack网络模型的骨架L2 Agent如何劫持OVS流表、L3 Agent怎样通过命名空间隔离路由、Metadata Agent凭什么能穿透租户网络获取实例信息、DHCP Agent又是如何用dnsmasq实现IP地址分发的闭环。这些组件之间没有黑盒全是靠配置文件里的参数、数据库里的状态、消息队列中的事件、以及Linux内核网络栈的底层能力咬合在一起。一旦某个环节的参数偏差0.1%整个网络平面就会像多米诺骨牌一样倒下——而错误表现可能只是虚拟机ping不通网关或者浮动IP绑定后完全不可达。所以这篇内容不是教你怎么敲几条apt install命令而是带你回到2014年OpenStack社区最原始的手动部署现场用最笨、最透明、也最扎实的方式把Neutron从源码编译、服务注册、数据库初始化、消息队列对接、到外部物理网络映射全部拆开揉碎讲清楚。它适合三类人正在备考OpenStack认证如COA需要吃透底层逻辑的考生在私有云项目中必须定制化Neutron行为的运维工程师以及所有被“一键部署脚本”惯坏了、却始终搞不清br-ex和br-int到底谁该接物理网卡的开发者。关键词里没有写出来的“OVS”“ML2插件”“Provider Network”“Flat/VLAN模式”恰恰是这场安装战役里真正决定成败的战壕与弹药。2. 为什么必须“手动”自动部署工具掩盖了90%的故障根源现在随便搜“OpenStack安装”满屏都是DevStack、Packstack、RDO Manager、甚至Ansible一键脚本。它们确实快5分钟就能拉起一个能跑Hello World的Dashboard。但代价是什么是把Neutron的27个配置文件、14个systemd服务单元、8个数据库表结构、6种消息队列交换器exchange和路由键routing key全部封装进一个/tmp/.devstack临时目录里再用Python脚本自动填充变量。你得到的是一个“能用”的黑箱而不是一个“可控”的系统。我带过三个团队做OpenStack迁移每次遇到网络问题第一反应都是翻Packstack生成的answers.conf第二反应是重跑脚本。结果呢问题没解决反而因为重装导致数据库schema冲突neutron-db-manage upgrade head直接报错。后来我们逼自己回归手动安装才发现那些被脚本自动处理掉的“小事”全是雷neutron.conf里core_plugin ml2这一行背后要求/etc/neutron/plugins/ml2/ml2_conf.ini必须存在且语法正确而Packstack会静默跳过语法校验ml2_conf.ini中type_drivers flat,vlan的顺序决定了Neutron创建网络时的默认驱动选择逻辑顺序颠倒会导致openstack network create --provider-network-type vlan命令被拒绝linuxbridge_agent.ini或openvswitch_agent.ini里physical_interface_mappings physnet1:eth1的physnet1必须和ml2_conf.ini中tenant_network_types vlan下的network_vlan_ranges physnet1:1000:2000完全一致否则L2 Agent启动时会因无法匹配物理网络映射而静默退出最致命的是metadata_agent.ini里的nova_metadata_host如果填的是控制节点主机名而非IP而DNS解析又未配置那么所有虚拟机的curl http://169.254.169.254/latest/meta-data/请求都会超时——但neutron-metadata-agent进程本身显示为active日志里只有INFO级别日志根本不会报错。这些细节自动部署工具要么帮你“猜”要么干脆忽略。而手动安装就是强迫你亲手写下每一行配置亲眼看着neutron-db-manage执行SQL建表亲手用ovs-vsctl show验证网桥连接用ip netns exec qrouter-xxx ip a检查命名空间内的接口状态。这不是复古情怀这是建立对网络控制平面的“肌肉记忆”。当你能闭着眼写出/etc/neutron/plugins/ml2/ml2_conf.ini中mechanism_drivers和extension_drivers的典型组合并解释为什么l2population必须配合vxlan使用你就已经超越了90%只会调API的OpenStack使用者。3. 环境准备从Ubuntu 22.04裸机到Neutron就绪的七道硬门槛手动安装Neutron第一步永远不是下载代码而是把操作系统这台“机床”调校到绝对水平。我们以Ubuntu 22.04 LTS为基准环境这是当前企业级OpenStack部署最主流的选择明确列出七道不可绕过的硬性门槛每一道都对应一个真实踩坑场景3.1 内核网络参数调优不是可选而是生存必需Neutron大量依赖Linux内核的高级网络特性尤其是命名空间network namespace、VXLAN隧道、以及OVS的内核模块。Ubuntu 22.04默认内核5.15虽已支持但关键参数仍需手动开启# 编辑 /etc/sysctl.conf追加以下内容 net.ipv4.ip_forward 1 net.ipv4.conf.all.rp_filter 0 net.ipv4.conf.default.rp_filter 0 net.bridge.bridge-nf-call-iptables 1 net.bridge.bridge-nf-call-ip6tables 1 # 加载br_netfilter模块确保其在启动时加载 echo br_netfilter | sudo tee -a /etc/modules sudo sysctl -p提示rp_filter 0是关键。很多新手在配置Provider Network后发现虚拟机无法访问外网查遍Neutron日志无果最后发现是rp_filter反向路径过滤在qrouter命名空间内启用了严格模式导致回包被丢弃。这个参数必须设为0否则L3 Agent的SNAT/DNAT规则形同虚设。3.2 Open vSwitchOVS的深度编译别碰Ubuntu源里的“阉割版”Ubuntu官方仓库的openvswitch-switch包版本2.17.x虽然能跑但它默认禁用了dpdk和userspacedatapath且OVSDB服务的SSL支持不完整。对于生产环境我们必须从源码编译# 安装编译依赖 sudo apt update sudo apt install -y build-essential python3-dev libssl-dev libpcap-dev libnuma-dev # 下载OVS 3.1.0与OpenStack Yoga/Zed版本兼容性最佳 wget https://www.openvswitch.org/releases/openvswitch-3.1.0.tar.gz tar xzf openvswitch-3.1.0.tar.gz cd openvswitch-3.1.0 # 配置编译选项启用所有关键特性 ./configure --prefix/usr --localstatedir/var --sysconfdir/etc --enable-ssl --with-linux/lib/modules/$(uname -r)/build # 编译并安装注意不要用make install用make install-systemd make -j$(nproc) sudo make install-systemd编译完成后必须验证OVS内核模块是否正确加载sudo ovs-vsctl --version # 应输出3.1.0 sudo lsmod | grep openvswitch # 必须看到openvswitch模块 sudo ovs-dpctl show # 应显示systemovs-system datapath注意如果lsmod | grep openvswitch无输出说明内核模块未加载。此时需运行sudo modprobe openvswitch并将其加入/etc/modules确保开机加载。这是手动安装中最常被忽略的一步直接导致后续ovs-vsctl add-br br-int命令失败。3.3 消息队列RabbitMQ的权限与策略不是“能连上”就行Neutron严重依赖RabbitMQ进行组件间通信如Server通知Agent更新端口状态。Ubuntu源里的rabbitmq-server3.9.x默认配置过于宽松必须精细化管控# 启动服务并启用管理插件 sudo systemctl enable rabbitmq-server sudo systemctl start rabbitmq-server sudo rabbitmq-plugins enable rabbitmq_management # 创建专用用户neutron密码neutron123生产环境请替换 sudo rabbitmqctl add_user neutron neutron123 sudo rabbitmqctl set_permissions -p / neutron .* .* .* sudo rabbitmqctl set_user_tags neutron administrator但仅此还不够。RabbitMQ的ha-mode高可用模式必须显式配置否则当Neutron Server集群扩容时消息会丢失# 设置镜像队列策略确保所有neutron.*队列在所有节点镜像 sudo rabbitmqctl set_policy ha-all ^neutron\. {ha-mode:all}实测心得很多团队在Neutron Server重启后发现Agent收不到更新查RabbitMQ管理界面发现neutron-plugin-agent-notifier队列堆积了数千条未确认消息。根因就是没配ha-modeServer重启时队列被清空。手动安装时这一步必须写进部署文档不能依赖“以后再配”。3.4 数据库MariaDB的字符集与权限一个utf8mb4引发的血案Neutron的数据库表结构对Unicode支持要求极高例如安全组规则描述、网络名称等字段可能含emoji。Ubuntu 22.04的MariaDB 10.6默认字符集是latin1必须全局切换-- 登录MariaDB sudo mysql -u root -- 修改全局配置编辑 /etc/mysql/mariadb.conf.d/50-server.cnf [mysqld] collation-server utf8mb4_unicode_ci init-connectSET NAMES utf8mb4 character-set-server utf8mb4 -- 创建专用数据库和用户 CREATE DATABASE neutron CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; GRANT ALL PRIVILEGES ON neutron.* TO neutronlocalhost IDENTIFIED BY neutrondb123; GRANT ALL PRIVILEGES ON neutron.* TO neutron% IDENTIFIED BY neutrondb123; FLUSH PRIVILEGES; EXIT;踩坑实录曾有一个客户在neutron-db-manage upgrade head后neutron-server启动时报OperationalError: (1366, Incorrect string value: \\xF0\\x9F\\x98\\x80 for column name at row 1)。查了半天发现是neutron数据库的字符集仍是latin1而neutron-server进程连接时指定了charsetutf8mb4导致插入emoji时报错。手动安装时数据库字符集必须在neutron-db-manage执行前就100%确认。3.5 Python虚拟环境与依赖隔离告别“pip list”里的混乱战场Neutron服务neutron-server,neutron-l3-agent等必须运行在纯净的Python环境中。Ubuntu系统自带的Python 3.10和pip会与系统包管理器apt产生冲突。标准做法是创建独立venv# 创建专用venv python3 -m venv /opt/stack/venv-neutron source /opt/stack/venv-neutron/bin/activate # 升级pip并安装基础依赖 pip install --upgrade pip pip install setuptools # 安装Neutron核心依赖以Yoga版本为例 pip install neutron22.0.0 oslo.db12.1.0 oslo.messaging13.3.0 neutron-lib3.10.0关键细节neutron-lib的版本必须与neutron主版本严格匹配。例如Neutron 22.0.0Yoga必须搭配neutron-lib3.10.0。如果pip install neutron自动拉取了不匹配的neutron-libneutron-server启动时会报ImportError: cannot import name get_context from neutron_lib.context。手动安装时版本矩阵表必须打印出来贴在工位上。3.6 网络物理拓扑的预先规划Provider Network的“三张网卡”铁律这是外部环境配置的核心。Neutron Provider Network要求物理网络与虚拟网络严格映射。我们采用最典型的“三网卡”架构网卡用途IP段关键配置eth0管理网络Management192.168.1.0/24配置静态IP用于SSH、API访问eth1外部网络External无IP纯二层必须不配置IP作为br-ex的物理端口eth2租户网络TenantVXLAN10.0.0.0/24配置IP用于OVS VXLAN隧道端点验证eth1是否“干净”ip addr show eth1 # 输出中不应出现inet行 cat /proc/sys/net/ipv4/conf/eth1/rp_filter # 必须为0经验技巧很多新手给eth1配了IP以为这样能“管理”外部网络。结果br-ex创建后eth1的IP被OVS接管导致控制节点自身失联。记住Provider Network的物理网卡就是一根“哑线”只负责透传二层帧IP地址是br-ex桥接器的事。3.7 systemd服务单元文件的重写让Neutron真正“活”在Linux里Ubuntu的systemd服务管理是Neutron稳定运行的基石。不能依赖pip install自动生成的脚本必须手写.service文件精确控制启动顺序、依赖关系和资源限制# /etc/systemd/system/neutron-server.service [Unit] DescriptionOpenStack Neutron Server Afternetwork.target rabbitmq-server.service mariadb.service Wantsrabbitmq-server.service mariadb.service [Service] Typesimple Userneutron Groupneutron EnvironmentPATH/opt/stack/venv-neutron/bin:/usr/local/bin:/usr/bin:/bin EnvironmentPYTHONPATH/opt/stack/venv-neutron/lib/python3.10/site-packages ExecStart/opt/stack/venv-neutron/bin/neutron-server \ --config-file /etc/neutron/neutron.conf \ --config-file /etc/neutron/plugins/ml2/ml2_conf.ini \ --log-file /var/log/neutron/server.log Restarton-failure RestartSec10 LimitNOFILE65536 [Install] WantedBymulti-user.target核心逻辑After和Wants确保Neutron Server在RabbitMQ和MariaDB之后启动LimitNOFILE65536防止高并发时文件描述符耗尽EnvironmentPYTHONPATH确保能正确加载neutron-lib。这些细节pip install生成的脚本全都没有。4. Neutron核心服务的手动部署从数据库初始化到Agent心跳完成环境准备后真正的Neutron部署才开始。这里没有魔法只有四步确定性操作每一步都必须验证成功才能进入下一步。4.1 数据库Schema初始化neutron-db-manage不是命令是契约neutron-db-manage是Neutron与数据库之间的“契约签署者”。它读取neutron.conf中的数据库连接串然后根据neutron包内置的alembic迁移脚本逐条执行SQL建表、建索引、设约束。绝不能跳过# 确保neutron用户能连上数据库 mysql -h localhost -u neutron -pneutrondb123 neutron -e SELECT 1 # 执行数据库初始化注意必须指定--config-file否则读不到配置 sudo -u neutron /opt/stack/venv-neutron/bin/neutron-db-manage \ --config-file /etc/neutron/neutron.conf \ --config-file /etc/neutron/plugins/ml2/ml2_conf.ini \ upgrade head # 验证表是否创建成功 mysql -h localhost -u neutron -pneutrondb123 neutron -e SHOW TABLES LIKE networks; # 应返回 networks 表关键检查点执行upgrade head后必须检查/var/log/neutron/server.log末尾是否有INFO alembic.runtime.migration — Context impl MySQLImpl.和INFO alembic.runtime.migration — Running upgrade - xxxxxxxxxx, xxxxxxxxxx。如果只有INFO没有Running upgrade说明neutron-db-manage根本没连上数据库可能是neutron.conf里的connection参数写错了。4.2 ML2插件配置ml2_conf.ini是Neutron的“宪法”ML2Modular Layer 2是Neutron的默认核心插件其配置文件/etc/neutron/plugins/ml2/ml2_conf.ini定义了整个网络平面的行为准则。以下是生产环境最精简有效的配置[ml2] type_drivers flat,vlan,vxlan tenant_network_types vxlan mechanism_drivers openvswitch,l2population extension_drivers port_security,qos [ml2_type_flat] flat_networks external [ml2_type_vlan] network_vlan_ranges physnet1:1000:2000 [ml2_type_vxlan] vni_ranges 1001:2000 vxlan_group 239.1.1.1 [securitygroup] enable_ipset true [ovs] local_ip 10.0.0.10 # eth2的IPVXLAN隧道端点 bridge_mappings physnet1:br-ex [agent] tunnel_types vxlan l2_population true原理解析bridge_mappings physnet1:br-ex将物理网络physnet1映射到OVS网桥br-ex而[ml2_type_vlan]中的network_vlan_ranges physnet1:1000:2000则规定了physnet1上允许使用的VLAN ID范围。这两行配置必须严格一致否则neutron-server启动时会报InvalidNetworkType: Unknown provider network type vlan。4.3 OVS网桥的物理世界锚定br-int、br-ex、br-tun的诞生仪式Neutron的网络世界由三个OVS网桥构成骨架。手动创建它们就是把虚拟网络“钉”在物理服务器上的过程# 创建集成网桥br-int所有虚拟机端口都挂在这里 sudo ovs-vsctl add-br br-int sudo ovs-vsctl set bridge br-int other-config:datapath-id0000000000000001 # 创建外部网桥br-ex直连物理网卡eth1 sudo ovs-vsctl add-br br-ex sudo ovs-vsctl add-port br-ex eth1 # 创建隧道网桥br-tun用于VXLAN流量 sudo ovs-vsctl add-br br-tun sudo ovs-vsctl set bridge br-tun other-config:datapath-id0000000000000002 # 验证网桥创建成功 sudo ovs-vsctl show # 输出中应包含br-int、br-ex、br-tun三个网桥且br-ex下有Port eth1实操验证创建br-ex后立即执行ip link show eth1你会发现eth1的状态变为DOWN且master字段指向ovs-system。这是OVS接管了eth1的标志证明物理网卡已成功“献祭”给Neutron。4.4 Agent服务的启动与心跳让控制平面“看见”数据平面Neutron Server是大脑Agent是四肢。启动Agent就是让大脑能感知到四肢的存在# 启动Open vSwitch Agent负责br-int和br-tun sudo systemctl daemon-reload sudo systemctl enable neutron-openvswitch-agent sudo systemctl start neutron-openvswitch-agent # 启动L3 Agent负责路由和NAT sudo systemctl enable neutron-l3-agent sudo systemctl start neutron-l3-agent # 启动DHCP Agent负责IP分配 sudo systemctl enable neutron-dhcp-agent sudo systemctl start neutron-dhcp-agent # 启动Metadata Agent负责提供实例元数据 sudo systemctl enable neutron-metadata-agent sudo systemctl start neutron-metadata-agent心跳验证Agent启动后必须立刻检查neutron-server日志sudo tail -f /var/log/neutron/server.log | grep report_state # 正常应看到类似INFO neutron.plugins.ml2.plugin — Reporting state...同时检查Agent自身的日志sudo journalctl -u neutron-openvswitch-agent -f | grep Connected # 应看到INFO neutron.agent.rpc — Connected to AMQP server on localhost:5672如果server.log里没有report_state说明Agent根本没连上Server大概率是neutron.conf里的rpc_backend或transport_url配置错误。5. 外部环境配置实战Provider Network从理论到落地的完整链路“外部环境配置”的核心就是让Neutron管理的虚拟网络能真正接入物理世界的互联网。这绝非配置一个浮动IP那么简单而是一条贯穿控制平面、数据平面、物理网络的完整链路。5.1 创建Provider Network--provider-*参数的每一个字都重若千钧Provider Network是Neutron与物理网络的“外交条约”。创建时所有--provider-*参数必须与ml2_conf.ini中的配置严丝合缝# 创建名为public的Provider Network openstack network create --share \ --provider-network-type flat \ --provider-physical-network external \ --external \ public # 创建子网注意no-dhcp是必须的Provider Network的DHCP由物理网络提供 openstack subnet create --network public \ --allocation-pool start192.168.100.10,end192.168.100.200 \ --dns-nameserver 8.8.8.8 \ --gateway 192.168.100.1 \ --subnet-range 192.168.100.0/24 \ --no-dhcp \ public-subnet参数深挖--provider-physical-network external中的external必须与ml2_conf.ini中[ml2_type_flat] flat_networks external的值完全一致。如果ml2_conf.ini里写的是physnet1这里就必须写--provider-physical-network physnet1。大小写、拼写、空格一个都不能错。5.2 创建Router并关联router-gateway不是按钮是路由表的手术刀Router是Provider Network的“海关”。router-gateway命令本质是在qrouter命名空间内为br-ex网桥添加一条默认路由并配置SNAT规则# 创建路由器 openstack router create provider-router # 将public网络设置为路由器的外部网关 openstack router set --external-gateway public provider-router # 创建内部网络tenant network openstack network create internal-net openstack subnet create --network internal-net \ --gateway 10.0.1.1 \ --subnet-range 10.0.1.0/24 \ internal-subnet # 将内部网络连接到路由器 openstack router add subnet provider-router internal-subnet验证链路执行完上述命令后进入qrouter命名空间检查路由表# 获取router ID neutron router-list | grep provider-router # 进入命名空间ID为实际UUID sudo ip netns exec qrouter-uuid ip route # 输出中必须包含 # default via 192.168.100.1 dev qg-xxxxxx # 10.0.1.0/24 dev qr-xxxxxx proto kernel scope link src 10.0.1.1如果缺了default via说明router-gateway没生效neutron-l3-agent可能未运行或配置错误。5.3 浮动IPFloating IP的物理穿透从虚拟机到公网的最后100米浮动IP是Provider Network的终极交付物。它的分配触发了Neutron一系列底层操作# 为虚拟机分配浮动IP openstack floating ip create public # 假设分配到 192.168.100.50 # 将浮动IP绑定到虚拟机端口 openstack server add floating ip vm-name 192.168.100.50底层机制当执行openstack server add floating ip时neutron-server会在数据库中记录floatingip表的绑定关系通过RPC通知neutron-l3-agentneutron-l3-agent在qrouter命名空间内执行iptables -t nat -A POSTROUTING -s 10.0.1.10 -j SNAT --to-source 192.168.100.50假设VM IP为10.0.1.10同时执行iptables -t nat -A PREROUTING -d 192.168.100.50 -j DNAT --to-destination 10.0.1.10。因此验证浮动IP是否生效不能只看OpenStack CLI输出必须登录qrouter命名空间执行sudo iptables -t nat -L -n | grep 192.168.100.50确认两条规则都存在。5.4 外部物理网络的最终握手br-ex与物理交换机的配置协同Provider Network的终点是物理交换机。br-ex只是一个OVS网桥它需要与上游交换机达成协议如果物理交换机是普通二层交换机无VLAN配置br-ex直接透传所有帧无需额外配置如果物理交换机是三层交换机或防火墙且public网络需要接入特定VLAN如VLAN 100则必须在交换机上将连接eth1的端口配置为Trunk模式并允许VLAN 100通过更关键的是MTUbr-ex的MTU必须与物理链路一致。如果物理交换机端口MTU为1500则br-ex的MTU也必须是1500sudo ip link set br-ex mtu 1500真实案例某金融客户部署后浮动IP能ping通但HTTP无法访问。抓包发现TCP SYN包被截断。最终定位是br-exMTU为1500而物理链路因中间设备如防火墙启用了Jumbo Frame实际MTU为9000。br-ex发送的大包被中间设备丢弃。解决方案统一所有环节MTU为1500或全程启用Jumbo Frame。6. 故障排查黄金链路当openstack network list返回空时你该看哪5个地方手动安装的价值在于故障发生时你能精准定位到问题发生的“地质断层”。当openstack network list返回空列表或虚拟机无法获取IP时请按此黄金链路逐层排查6.1 第一层Neutron Server的“心跳”是否还在跳动# 检查服务状态 sudo systemctl status neutron-server # 检查进程是否真在运行避免僵尸进程 ps aux | grep neutron-server | grep -v grep # 检查端口监听9696是Neutron API端口 sudo ss -tlnp | grep :9696如果systemctl status显示active (running)但ss -tlnp看不到9696端口说明neutron-server进程已崩溃但systemd未检测到。此时必须看/var/log/neutron/server.log的最后100行寻找CRITICAL或ERROR关键字。6.2 第二层数据库连接与表状态——neutron-server的“氧气面罩”# 直接用mysql客户端测试连接 mysql -h localhost -u neutron -pneutrondb123 neutron -e SELECT COUNT(*) FROM networks; # 检查neutron-server日志中的数据库连接日志 sudo grep Connecting to database /var/log/neutron/server.log | tail -5 # 正常应有INFO neutron.db.api — Connecting to database...如果SELECT COUNT(*) FROM networks;返回0但neutron-db-manage upgrade head已执行成功说明neutron-server根本没有连接到这个数据库。检查neutron.conf中的[database] connection字符串确认host、port、username、password、database name全部正确且/etc/hosts中没有错误的host映射。6.3 第三层RabbitMQ消息队列——Agent与Server的“神经突触”# 检查neutron-server是否连上了RabbitMQ sudo grep AMQP server /var/log/neutron/server.log | tail -5 # 正常应有INFO neutron.agent.rpc — Connected to AMQP server... # 检查RabbitMQ管理界面http://control-node-ip:15672登录后查看 # Queues标签页neutron-server、neutron-plugin-agent-notifier等队列是否存在且消费者Consumers数0 # Admin标签页neutron用户是否在线Online如果server.log里没有Connected to AMQP server但rabbitmqctl list_users能看到neutron用户说明neutron.conf里的transport_url格式错误。标准格式为transport_url rabbit://neutron:neutron123localhost:5672/。注意末尾的/和符号的位置。6.4 第四层OVS网桥与端口——数据平面的“血管造影”# 列出所有OVS网桥 sudo ovs-vsctl show # 检查br-int是否有端口应有patch-tun、int-br-ex等 sudo ovs-vsctl list-ports br-int # 检查br-ex是否绑定了eth1 sudo ovs-vsctl list-ports br-ex # 检查br-tun是否有端口应有patch-int、vxlan-0a00000a等 sudo ovs-vsctl list-ports br-tun如果br-ex下没有eth1说明ovs-vsctl add-port br-ex eth1命令未执行或执行后eth1被其他服务如NetworkManager抢回。此时需sudo systemctl stop NetworkManager并禁用它。6.5 第五层qrouter命名空间——网络功能的“手术室”# 列出所有qrouter命名空间 sudo ip netns list | grep qrouter # 进入命名空间检查接口 sudo ip netns exec qrouter-uuid ip a # 检查路由表 sudo ip netns exec qrouter-uuid ip route # 检查iptables NAT规则 sudo ip netns exec qrouter-uuid iptables -t nat -L -n如果ip netns list为空说明neutron-l3-agent根本没创建任何router。此时检查/var/log/neutron/l3-agent.log寻找Creating namespace for router关键字。如果没有说明neutron-l3-agent未收到创建router的RPC消息问题一定出在Server或RabbitMQ层。7. 手动安装后的加固与监控让Neutron从“能跑”到“稳跑”手动安装完成只是万里长征第一步。生产环境要求Neutron具备自我诊断和持续健康的能力7.1 日志轮转Logrotate防止/var/log/neutron撑爆磁盘Neutron日志增长极快必须配置logrotate# 创建 /etc/logrotate.d/neutron /var/log/neutron/*.log { daily missingok rotate 30 compress delaycompress notifempty create 644 neutron neutron sharedscripts postrotate systemctl kill --signalSIGHUP neutron-server neutron-l3-agent neutron-dhcp-agent neutron-metadata-agent endscript }