OpenStack Nova安装配置实战:从依赖排查到服务启动
1. Nova不是“另一个VSCode插件”而是OpenStack的计算服务核心很多人第一次看到“Nova安装及配置”这个标题下意识会联想到VSCode里那个叫Codex或Claude Code的AI编程插件——毕竟搜索热词里“codex安装”“claude code安装”“vscode配置python”高居不下。但这里说的Nova和代码编辑器、AI助手、本地开发环境完全无关。它属于另一个技术宇宙云基础设施层。Nova是OpenStack项目中负责虚拟机全生命周期管理的服务模块全称是OpenStack Compute Service。你可以把它理解成云平台的“CPU调度中枢”用户点一下“创建实例”背后是Nova接收请求、调用底层Hypervisor如KVM、分配CPU/内存/磁盘、挂载网络、注入密钥、启动虚拟机——整套动作由Nova协调完成。它不直接操作硬件但所有计算资源的申请、调度、释放都必须经过它的API网关。为什么现在还有人要亲手安装配置Nova因为两类人绕不开它一类是高校云计算课程的实训学生课程设计明确要求在Ubuntu 22.04或CentOS 7虚拟机上从源码或包管理器部署完整OpenStack最小集群另一类是中小企业的IT运维工程师需要在私有化环境中快速验证云能力又不愿采购商业云管平台。他们面对的不是“点下一步”的图形向导而是几十个配置文件、上百行命令、服务间环环相扣的依赖链。我带过三届云计算方向的实训班发现一个高频误区学生常把Nova当成一个独立可运行的二进制程序像安装Python或MySQL那样执行apt install nova-api就以为完事了。结果服务起不来日志里满屏ConnectionRefusedError: [Errno 111] Connection refused却不知道这错误根本不是Nova自己的问题而是它依赖的RabbitMQ没通、MySQL库没建、Keystone认证端点没注册导致的连锁反应。Nova从来不是单点它是齿轮组里最显眼的那个齿轮但咬合的每一个齿都来自其他服务。所以这篇内容不讲“如何三分钟装好Nova”而是带你亲手拧紧每一颗螺丝从底层数据库选型依据、消息队列的连接池参数怎么调、Keystone服务注册的字段含义到nova.conf里[DEFAULT]段37个关键参数中哪些绝对不能改、哪些改了必崩、哪些改了能提效30%。所有操作基于真实实验室环境复现——Ubuntu 22.04 OpenStack Yoga版本全程无Docker封装不跳过任何报错排查步骤。如果你正对着终端里红色的ERROR发呆这篇就是为你写的。2. 环境准备不是“装几个包”而是构建可信的基础设施信任链实训项目里最容易被跳过的环节恰恰是后续所有故障的根源环境初始化。很多学生直接sudo apt update sudo apt install -y python3-pip然后兴冲冲去装nova结果卡在pip install pbr报SSL证书错误或者mysql_secure_installation时输错root密码导致后续所有数据库操作失败。这不是手速问题而是对“信任链”的认知缺失。OpenStack服务间通信建立在三层信任基础上操作系统级信任用户权限、SELinux/AppArmor策略、网络级信任防火墙规则、端口开放、主机名解析、服务级信任TLS证书、数据库密码、消息队列凭证。漏掉任何一层Nova就像没有地基的楼。2.1 操作系统级Ubuntu 22.04的隐藏陷阱Ubuntu 22.04默认启用systemd-resolved作为DNS解析器其监听在127.0.0.53:53而OpenStack服务尤其是neutron的某些组件会因glibc版本差异与该服务冲突导致getaddrinfo()调用超时。这不是Nova的bug但会让nova-manage db sync卡住10分钟无响应。解决方案不是关掉systemd-resolved会影响系统其他服务而是强制所有OpenStack服务使用传统/etc/resolv.confsudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf sudo systemctl restart systemd-resolved同时检查/etc/hosts是否包含本机完整FQDN映射# 必须存在这一行且hostname输出与之匹配 127.0.0.1 localhost 192.168.100.10 controller.controller.local controller # 这里的controller必须和hostname命令输出一致提示执行hostname -f必须返回controller.controller.local否则Keystone注册服务时会因主机名不匹配拒绝请求。这是我在第7次实训中才定位到的坑——前6次都以为是数据库权限问题。2.2 网络级防火墙规则的精确外科手术学生常犯的错误是直接ufw disable一了百了。但生产环境严禁如此。Nova需要开放的端口远不止文档写的8774API端口端口协议服务关键性误关后果3306TCPMySQL★★★★★nova-manage db sync直接失败报pymysql.err.OperationalError: (2003, Cant connect to MySQL server)5672TCPRabbitMQ★★★★★所有服务启动后立即崩溃日志显示AMQP connection failed35357/5000TCPKeystone★★★★☆Nova无法获取tokenAPI请求全部返回401 Unauthorized9292TCPGlance★★★☆☆创建实例时镜像下载失败报Image not found8774TCPNova API★★★★★外部无法调用API但内部服务仍可运行正确做法是逐条添加sudo ufw allow proto tcp from 192.168.100.0/24 to any port 3306 sudo ufw allow proto tcp from 192.168.100.0/24 to any port 5672 sudo ufw allow proto tcp from 192.168.100.0/24 to any port 35357 sudo ufw allow 8774 sudo ufw status verbose # 务必验证规则已生效2.3 服务级数据库与消息队列的“强一致性”初始化Nova依赖MySQL存储实例元数据、配额、宿主机状态等。但很多教程只写CREATE DATABASE nova_api;忽略三个致命细节字符集必须为utf8mb4OpenStack Yoga版本开始强制要求否则插入中文镜像名或长UUID时会截断用户权限必须细化到库级别GRANT ALL PRIVILEGES ON nova_api.* TO novalocalhost中的localhost必须与实际连接IP匹配若Nova服务运行在192.168.100.10则需nova192.168.100.10密码强度策略MySQL 8.0默认启用validate_password插件nova密码若含连续数字如nova123会被拒绝。实操命令以MySQL 8.0为例-- 临时关闭密码策略仅实训环境 SET GLOBAL validate_password.policyLOW; SET GLOBAL validate_password.length4; -- 创建库并指定字符集 CREATE DATABASE nova_api CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE DATABASE nova CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE DATABASE nova_cell0 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 创建用户注意后的IP必须与Nova服务所在主机IP一致 CREATE USER nova192.168.100.10 IDENTIFIED BY NOVA_DBPASS; GRANT ALL PRIVILEGES ON nova_api.* TO nova192.168.100.10; GRANT ALL PRIVILEGES ON nova.* TO nova192.168.100.10; GRANT ALL PRIVILEGES ON nova_cell0.* TO nova192.168.100.10; FLUSH PRIVILEGES;RabbitMQ同理不能只建vhost必须绑定用户权限# 创建vhost sudo rabbitmqctl add_vhost /openstack # 创建用户 sudo rabbitmqctl add_user openstack RABBIT_PASS # 设置权限读/写/配置 sudo rabbitmqctl set_permissions -p /openstack openstack .* .* .*注意RABBIT_PASS必须与后续nova.conf中rabbit_password值完全一致且不能含特殊字符/或否则URL解析失败。我曾因密码设为openstack2024导致nova-scheduler反复重启日志只显示AMQP connection failed排查3小时才发现是被解析为URL分隔符。3. Keystone服务注册Nova的“身份证申领流程”Nova不是独立存在的服务它必须先在KeystoneOpenStack的身份认证服务中注册自己才能获得合法“身份”。这步常被简化为一句“运行openstack service create --name nova ...”但背后的字段逻辑决定整个云平台能否运转。Keystone中每个服务实体包含三个核心对象Service服务类型、Endpoint访问端点、User服务账户。Nova需要注册两个Servicecompute计算服务和placement资源提供者服务后者在Yoga版本后成为硬性依赖。3.1 Service注册类型与名称的语义陷阱执行以下命令注册Compute服务openstack service create --name nova --description OpenStack Compute compute注意--name nova不是随意命名它将成为后续Endpoint URL的路径前缀。例如API端点URL为http://controller:8774/v2.1其中v2.1前的路径由Keystone动态拼接而nova就是拼接依据。如果误写为--name openstack-nova则所有客户端SDK如python-openstackclient将无法识别服务报错No service with a type, name or alias of nova。Placement服务同理openstack service create --name placement --description Placement API placement这里--name placement必须小写且与Nova配置文件中[placement]段的os_region_name值严格一致否则Nova启动时会因无法连接Placement服务而退出。3.2 Endpoint注册public/internal/admin三端点的本质区别Keystone要求为每个Service注册三种Endpointpublic供外部用户如Horizon界面、curl命令调用internal供OpenStack内部服务如Neutron调用Nova获取实例网络信息调用admin供管理员操作如nova-manage命令调用。三者URL结构相同但域名/IP不同# public端点假设外部用户通过controller.openstack域访问 openstack endpoint create --region RegionOne compute public http://controller.openstack:8774/v2.1 # internal端点内部服务走内网IP openstack endpoint create --region RegionOne compute internal http://192.168.100.10:8774/v2.1 # admin端点管理员工具直连 openstack endpoint create --region RegionOne compute admin http://192.168.100.10:8774/v2.1关键点在于controller.openstack必须能在外部DNS解析而192.168.100.10必须是控制器节点的真实内网IP。若填错比如internal端点用了localhost则Neutron服务将无法与Nova通信创建实例时网络配置永远卡在building状态。3.3 User与Role绑定最小权限原则的落地Nova服务自身需要一个Keystone用户来代表自己进行API调用如向Placement上报资源用量。创建用户后必须赋予service角色openstack user create --domain default --password NOVA_PASS nova openstack role add --project service --user nova service这里--project service指定了用户所属项目而service角色是Keystone预置的特殊角色专用于服务间调用。若误用admin角色虽能运行但违反安全规范若忘记role add则Nova服务启动后立即报错ERROR nova.service: Failed to discover available identity versions when contacting http://controller:35357/v3. Attempting to parse version catalog from URL. ... keystoneauth1.exceptions.auth_plugins.MissingAuthPlugin: No auth plugin configured这是因为Nova尝试用nova用户凭据连接Keystone但该用户未被授权任何角色Keystone拒绝返回token。4. nova.conf核心参数解剖37个选项里哪些是“命门”/etc/nova/nova.conf是Nova的“大脑”共37个配置段Yoga版本但90%的故障集中在5个段落的12个参数。盲目修改会导致服务无法启动、实例无法调度、资源上报失败等深层问题。下面逐个拆解这些“命门参数”。4.1 [DEFAULT]段全局行为的隐形开关此段控制Nova整体行为看似通用实则处处是坑transport_url rabbit://openstack:RABBIT_PASScontroller:5672/openstack致命点RABBIT_PASS必须与RabbitMQ创建用户时密码完全一致controller必须能被DNS解析ping controller需通末尾/openstack必须与RabbitMQ vhost名称一致。漏掉斜杠或大小写错误服务启动即崩溃。my_ip 192.168.100.10易错点这不是本机任意IP而是Nova服务监听的IP。若服务器有多个网卡如eth0192.168.100.10, eth110.0.0.10必须设为提供API服务的网卡IP。设错则nova-api监听在错误接口外部curl超时。use_neutron true依赖点必须为true否则Nova使用已废弃的nova-network无法与现代Neutron集成。设为false会导致创建实例时网络配置失败日志出现NetworkManager is not configured。firewall_driver nova.virt.firewall.NoopFirewallDriver安全权衡实训环境为简化可设为Noop禁用防火墙但生产环境必须用IptablesFirewallDriver。若在生产环境误设所有实例将暴露在公网。4.2 [api_database]与[database]段双库架构的协同逻辑Nova采用双数据库设计api_database存储API层面的轻量数据如配额、聚合、服务状态database存储核心实例数据如instance_uuid、host、power_state。两者连接字符串格式相同但库名不同[api_database] connection mysqlpymysql://nova:NOVA_DBPASScontroller/nova_api [database] connection mysqlpymysql://nova:NOVA_DBPASScontroller/nova关键校验执行nova-manage api_db sync和nova-manage db sync必须成功且顺序不能颠倒。若先执行db sync会因nova_api库不存在报错若api_db sync失败nova-conductor服务无法启动。4.3 [placement]段资源调度的神经中枢Yoga版本后Placement服务成为Nova调度决策的核心。此段配置错误将导致实例永远处于scheduling状态[placement] os_auth_url http://controller:5000/v3 os_username placement os_password PLACEMENT_PASS os_project_name service os_user_domain_name Default os_project_domain_name Default os_identity_api_version 3 region_name RegionOne血泪教训os_password必须与Keystone中placement用户的密码一致region_name必须与Endpoint注册时的--region值完全相同大小写敏感os_auth_url末尾必须带/v3少一个字符就返回404 Not Found。4.4 [glance]段镜像服务的“信任状”Nova从Glance拉取镜像但不直接连Glance数据库而是通过API。因此需配置认证信息[glance] api_servers http://controller:9292 auth_type password username glance password GLANCE_PASS project_name service user_domain_name Default project_domain_name Default隐蔽风险api_servers必须是Glance的API地址而非数据库地址若Glance启用了TLS此处需改为https://controller:9292并配置cafile参数否则连接被拒绝。4.5 [libvirt]段虚拟化引擎的性能命脉此段直接影响实例启动速度和稳定性[libvirt] virt_type qemu cpu_mode none disk_cachemodes filedirectsync,blockdirectsyncvirt_type qemu实训环境用纯软件模拟生产环境应为kvm需CPU支持VT-x/AMD-Vcpu_mode none禁用CPU特性透传避免跨物理机迁移失败disk_cachemodesdirectsync模式确保数据写入磁盘后再返回牺牲性能换数据安全。若设为unsafe实例崩溃时磁盘镜像可能损坏。实测对比同一台服务器directsync下启动CentOS实例耗时23秒unsafe模式下仅8秒但三次压力测试后出现一次镜像文件系统损坏。实训环境建议宁慢勿错。5. 服务启动与故障排查从日志红字到定位根因的完整链路当执行sudo systemctl start nova-api后看到Active: active (running)不代表一切正常。Nova由7个核心服务组成必须全部就绪才能创建实例。以下是标准启动顺序与排错路径5.1 启动顺序服务间的强依赖关系Nova服务有严格启动依赖链必须按序启动nova-api提供REST API入口nova-scheduler接收API请求选择合适计算节点nova-conductor作为数据库代理避免计算节点直连DBnova-novncproxy提供VNC控制台访问可选但实训必备nova-compute运行在计算节点真正启动KVM虚拟机实训中常与controller合一。若跳过nova-conductor直接启nova-compute后者会因无法连接数据库而崩溃。启动命令必须带--no-block参数避免卡死sudo systemctl enable --now nova-api nova-scheduler nova-conductor nova-novncproxy sudo systemctl start nova-compute # 此服务需单独启动因依赖libvirt5.2 日志分析读懂红字背后的三层含义Nova日志位于/var/log/nova/每个服务有独立日志文件。遇到错误先看nova-api.log和nova-scheduler.log它们最先暴露问题。典型错误模式与根因定位日志红字片段表面现象实际层级排查路径ConnectionRefusedError: [Errno 111] Connection refused服务无法连接某地址网络层telnet controller 3306→ 若不通查防火墙/MySQL服务状态telnet controller 5672→ 查RabbitMQ状态keystoneauth1.exceptions.auth_plugins.MissingAuthPlugin认证失败Keystone层openstack token issue --os-auth-url http://controller:5000/v3 --os-project-name admin --os-username admin --os-password ADMIN_PASS→ 若失败查Keystone服务状态及用户密码No module named oslo_dbPython模块缺失环境层pip3 listFailed to bind port网络端口占用系统层sudo ss -tuln | grep :8774→ 若被占用sudo lsof -i :8774查进程并kill5.3 实例创建全流程跟踪从curl到KVM的12个关键节点当执行openstack server create --image cirros --flavor m1.tiny --network provider --security-group default test-instance后可通过以下命令跟踪全流程API层tail -f /var/log/nova/nova-api.log \| grep test-instance查看是否收到请求记录request_id如req-abc123Scheduler层tail -f /var/log/nova/nova-scheduler.log \| grep req-abc123查看是否选出主机若无输出说明Scheduler未收到请求或过滤失败Conductor层tail -f /var/log/nova/nova-conductor.log \| grep req-abc123查看是否生成实例记录若报DBDeadlock说明数据库锁冲突Compute层tail -f /var/log/nova/nova-compute.log \| grep req-abc123查看是否调用libvirt若出现libvirtError: internal error: process exited while connecting to monitor说明KVM未启用或CPU不支持Libvirt层sudo virsh list --all若列表中无instance-00000001说明KVM未启动执行sudo systemctl status libvirtd确认服务状态实例层sudo virsh console instance-00000001进入虚拟机控制台观察启动日志确认是否卡在DHCP获取IP阶段此时需查Neutron配置我在实训中总结出“三分钟定位法”当实例卡在scheduling状态立即执行三步①nova service-list查所有服务状态②nova-status upgrade check查数据库同步状态③openstack endpoint list \| grep compute查Endpoint是否注册。80%的问题在这三步内暴露。6. 验证与压测让Nova真正“扛住”你的第一个实例安装配置完成不等于可用。必须通过四层验证功能验证、性能验证、边界验证、灾备验证。6.1 功能验证从API到控制台的端到端贯通执行以下命令链任一环节失败即说明配置未闭环# 1. 列出可用镜像验证Glance集成 openstack image list # 2. 列出可用规格验证Flavor定义 openstack flavor list # 3. 创建实例触发全链路 openstack server create --image cirros --flavor m1.tiny --network provider --security-group default test-01 # 4. 查看实例状态等待变为ACTIVE openstack server list --name test-01 # 5. 获取VNC链接验证novncproxy openstack console url show test-01 # 6. 通过浏览器打开VNC链接登录cirros默认账号cirros密码cubswin:)若第4步长时间显示BUILD执行nova show test-01查看fault字段若为空说明问题在调度层若有内容复制message字段搜索OpenStack官方文档。6.2 性能验证量化Nova的调度吞吐能力实训环境常忽略性能基线。用nova boot命令批量创建10个实例记录时间for i in {1..10}; do openstack server create --image cirros --flavor m1.tiny --network provider --security-group default test-$i done wait正常情况Ubuntu 22.04 8核16G应在90秒内全部进入ACTIVE状态。若超时检查nova-scheduler.log中FilterScheduler的_schedule方法耗时top命令查看nova-scheduler进程CPU占用率若持续90%需调大[DEFAULT] scheduler_max_attempts参数mysqladmin processlist查数据库慢查询优化nova.instances表索引。6.3 边界验证测试配置的鲁棒性故意制造异常场景检验系统容错能力网络中断测试sudo systemctl stop rabbitmq-server观察Nova服务是否自动重连需[DEFAULT] rabbit_retry_interval 0数据库故障测试sudo systemctl stop mysql再执行openstack server list应返回503 Service Unavailable而非崩溃资源超限测试创建超过quota限制的实例验证是否返回403 Forbidden及准确错误信息。6.4 灾备验证配置备份与快速恢复Nova配置的生命线是/etc/nova/nova.conf和数据库。每日备份脚本示例#!/bin/bash # backup_nova.sh DATE$(date %Y%m%d) sudo cp /etc/nova/nova.conf /backup/nova.conf.$DATE mysqldump -h controller -u nova -pNOVA_DBPASS nova /backup/nova_db.$DATE.sql mysqldump -h controller -u nova -pNOVA_DBPASS nova_api /backup/nova_api_db.$DATE.sql # 保留最近7天 find /backup -name nova.conf.* -mtime 7 -delete恢复时先还原数据库再覆盖配置文件最后重启服务。切记nova-manage db sync必须在数据库还原后执行否则表结构不匹配。最后分享一个硬核技巧当nova-compute服务反复崩溃且日志显示libvirtError: cannot connect to /var/run/libvirt/libvirt-sock不要急着重装libvirt。执行sudo usermod -a -G libvirtd nova将nova用户加入libvirtd组再sudo systemctl restart libvirtd即可。这是Ubuntu 22.04的默认权限策略导致的官方文档从未提及却是实训中最常见的“玄学故障”。