OpenStack Nova手动部署全指南:从零构建计算服务控制平面

📅 2026/7/8 18:17:03 👁️ 阅读次数 📝 编程学习
OpenStack Nova手动部署全指南:从零构建计算服务控制平面

1. Nova 是什么?别被名字骗了——它不是“新星”,而是 OpenStack 的核心计算服务

很多人第一次看到“Nova”这个词,下意识会联想到“nova star”(新星爆发),甚至以为是某个新兴的前端框架、AI 工具链,或者某款刚发布的 IDE 插件。尤其在当前热词列表里,“codex安装”“claude code安装”“vscode配置python”高频出现,很容易让人误判 Nova 的定位。但事实恰恰相反:Nova 是 OpenStack 项目中历史最久、架构最重、生产环境落地最广的核心计算服务(Compute Service),自 2010 年诞生起,它就承担着虚拟机全生命周期管理的全部职责——创建、调度、启动、暂停、迁移、快照、销毁,所有这些动作背后,都是 Nova 在协调资源、调用驱动、更新状态、响应 API。

我第一次接触 Nova 是在 2015 年接手一个私有云迁移项目,客户原有 VMware 环境要平滑过渡到开源栈。当时团队里有个刚毕业的同事,看到部署文档里写“Install Nova”,立刻去 GitHub 搜 “nova python library”,结果装了一堆无关的轻量级工具包,最后发现根本连不上控制节点。这个小插曲让我意识到:Nova 不是一个可 pip install 的单体 Python 包,而是一组协同工作的服务进程,必须按角色拆解、分节点部署、跨组件联调。它的“手动安装与配置”,本质上是在白纸上重建一套分布式计算控制平面——没有一键脚本兜底,没有图形界面引导,每一步都直面底层依赖、权限边界和网络拓扑的真实约束。

关键词里虽然空着,但结合热搜词“mysql安装配置教程”“redis下载安装配置windows”“git安装及配置教程”可以清晰看出用户意图:他们需要的不是概念科普,而是脱离 DevStack 或 Packstack 这类自动化工具后,从零编译、配置、启动 Nova 各组件的完整路径。这类需求通常出现在三类场景中:高校云计算课程实验要求学生理解组件间调用关系;企业信创改造需适配国产化中间件(如达梦替代 MySQL、东方通替代 Apache);或是资深运维为排查生产环境疑难问题,必须复现最小可运行单元。因此,本文不讲“如何用 DevStack 快速跑起来”,而是聚焦“当你删掉所有封装层,裸手拧螺丝时,到底要拧哪几颗、往哪拧、拧多紧”。

Nova 的手动部署之所以难,根源在于它天然的“四重耦合”:

  • 与数据库强耦合:MySQL/MariaDB 不仅存元数据,还承担服务状态同步(如 cell0 的 host_mapping 表);
  • 与消息队列强耦合:RabbitMQ 或 Kafka 不是可选组件,而是 Nova-conductor 与 nova-compute 之间命令下发与状态上报的唯一通道;
  • 与身份认证强耦合:Keystone 不只是登录入口,每个 API 请求都携带 token,Nova-api 必须实时校验其有效性与 scope;
  • 与虚拟化驱动强耦合:libvirt-qemu、VMware vCenter、甚至裸金属 Ironic,不同 driver 对配置项、日志路径、权限模型的要求天差地别。

这意味着,你无法像配置 VSCode Python 环境那样,复制粘贴几行命令就完事。一个典型的失败案例是:有人照着某篇过时博客,把 nova.conf 里transport_url写成rabbit://guest:guest@127.0.0.1:5672/,却忽略了 RabbitMQ 默认禁用 guest 用户远程登录——结果 nova-scheduler 死活连不上消息队列,日志里只有一行AMQP connection failed,翻遍文档也找不到原因。这种坑,只有亲手拧过螺丝的人才懂。

所以,本文的起点不是“怎么装”,而是“为什么必须这样装”。接下来,我会带你一层层剥开 Nova 的服务肌理,从环境准备的硬性门槛,到各组件的配置逻辑,再到启动后的验证闭环。所有操作均基于 OpenStack Yoga 版本(2022.2),这是目前企业生产环境采用率最高的稳定分支,兼容主流 Linux 发行版(Ubuntu 22.04 / CentOS Stream 9),且对 Python 3.9+ 和 systemd 支持完善。如果你正坐在终端前,面前是一台干净的虚拟机,那就准备好 root 权限,我们开始。

2. 环境准备:不是“装几个包”那么简单,而是构建一个受控的运行沙盒

手动安装 Nova 最容易被轻视的环节,恰恰是环境准备。很多人直接跳到apt install python3-novapip install nova,结果发现装上的只是客户端命令行工具(novaclient),而非服务端进程。真正的 Nova 服务必须从源码或官方仓库安装二进制包,并严格满足其运行时约束。这就像你要组装一台发动机,不能只买火花塞和活塞,还得先确认缸体材质、冷却液规格、曲轴箱密封等级——环境准备,就是为 Nova 构建这样一个受控的运行沙盒。

2.1 操作系统与内核:选择 Ubuntu 22.04 而非 CentOS Stream 9 的真实理由

OpenStack 官方推荐 Ubuntu LTS 和 RHEL/CentOS Stream,但实操中 Ubuntu 22.04 是更稳妥的选择。原因有三:
第一,Python 生态兼容性。Nova Yoga 版本要求 Python ≥ 3.8,但部分关键依赖(如 os-brick、oslo.db)在 CentOS Stream 9 的 Python 3.9 上存在隐式版本冲突。我曾在一个金融客户环境里遇到ImportError: cannot import name 'getargspec' from 'inspect',根源是 CentOS 的 python3-pip 包版本过旧,导致 oslo.utils 升级失败。而 Ubuntu 22.04 的 apt 仓库中,python3-nova 包已预编译并验证过所有依赖组合,省去大量手工解决 wheel 冲突的时间。

第二,systemd 服务模板成熟度。Nova 的各个服务(nova-api、nova-scheduler、nova-conductor、nova-compute)在 Ubuntu 上有完整的/lib/systemd/system/nova-*.service文件,包含正确的Restart=on-failureLimitNOFILE=65536ProtectSystem=full等安全加固参数。而在 CentOS Stream 9 中,这些文件常缺失或参数不全,需手动补全。例如,若未设置LimitNOFILE,当并发创建 50 台虚拟机时,nova-compute 会因文件描述符耗尽而静默崩溃,日志里只显示OSError: [Errno 24] Too many open files,排查成本极高。

第三,内核模块支持确定性。Nova-compute 依赖 libvirt,而 libvirt 又深度绑定内核的 KVM、VFIO、IOMMU 模块。Ubuntu 22.04 的 5.15 内核对这些模块的启用策略(如intel_iommu=on参数解析)经过长期验证,而 CentOS Stream 9 的 5.14 内核在某些老服务器 BIOS 下会出现 IOMMU group 分配异常,导致 PCI 设备直通失败。

提示:务必关闭 SELinux(CentOS)或 AppArmor(Ubuntu)。Nova 的日志路径(/var/log/nova/)、配置路径(/etc/nova/)、实例存储路径(/var/lib/nova/instances/)涉及大量跨进程文件读写,SELinux 的 strict 策略会拦截nova-compute/dev/kvm的访问,报错Permission denied。临时关闭命令为sudo setenforce 0(CentOS)或sudo systemctl stop apparmor(Ubuntu),生产环境需定制策略模块,但手动部署阶段,关掉是最高效的选择。

2.2 数据库:MySQL 8.0 的密码认证插件陷阱与修复方案

Nova 必须连接数据库存储实例元数据、配额、主机映射等信息。官方支持 MySQL、PostgreSQL、SQLite(仅测试用),但生产环境几乎全用 MySQL/MariaDB。这里埋着一个极易踩中的深坑:MySQL 8.0 默认使用 caching_sha2_password 认证插件,而 Nova 的 pymysql 驱动(截至 Yoga 版本)仅支持 mysql_native_password

现象是:所有 Nova 服务启动后,日志里反复出现pymysql.err.OperationalError: (1045, "Access denied for user 'nova'@'localhost' (using password: YES)"),但你确认密码完全正确,MySQL 命令行也能正常登录。这是因为 Nova 连接时,MySQL 服务器返回caching_sha2_password插件要求,而 pymysql 无法处理该握手流程,直接拒绝认证。

解决方案分三步,缺一不可:

  1. 创建用户时强制指定插件
CREATE USER 'nova'@'localhost' IDENTIFIED WITH mysql_native_password BY 'NovaPass123!'; GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost'; FLUSH PRIVILEGES;

注意:IDENTIFIED WITH mysql_native_password是关键,不能省略。

  1. 修改 MySQL 全局默认插件(可选但推荐)
    编辑/etc/mysql/mysql.conf.d/mysqld.cnf,在[mysqld]段落下添加:
default_authentication_plugin = mysql_native_password

然后重启 MySQL:sudo systemctl restart mysql。此举确保后续创建的所有用户默认使用兼容插件。

  1. Nova 配置中显式声明驱动
    /etc/nova/nova.conf[database]段,添加:
connection = mysql+pymysql://nova:NovaPass123!@127.0.0.1/nova?charset=utf8mb4

注意mysql+pymysql://前缀,明确指定使用 PyMySQL 驱动,而非默认的 MySQLdb(已废弃)。

注意:数据库名nova必须提前创建,且字符集必须为utf8mb4,否则插入中文实例名称时会报错Incorrect string value。创建命令:CREATE DATABASE nova CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

2.3 消息队列:RabbitMQ 的 vhost 与权限模型必须精确匹配

Nova 使用 AMQP 协议与消息队列通信,RabbitMQ 是最常用选择。但新手常犯的错误是:只创建用户,不创建 vhost(virtual host),或权限配置不全。vhost 是 RabbitMQ 的逻辑隔离单元,相当于数据库的 schema,Nova 要求所有服务连接到同一个 vhost(默认为/openstack),否则nova-scheduler发送的build_instances消息,nova-compute将无法消费。

标准配置流程如下:

  1. 创建 vhost:
sudo rabbitmqctl add_vhost /openstack
  1. 创建用户并设置密码:
sudo rabbitmqctl add_user openstack RABBIT_PASS
  1. 为用户分配 vhost 的全部权限(这是关键!):
sudo rabbitmqctl set_permissions -p /openstack openstack ".*" ".*" ".*"

注意-p /openstack参数必须与 vhost 名称一致,三个".*"分别对应配置(configure)写(write)读(read)权限。漏掉任何一个,Nova 服务都会在启动时卡在Waiting for AMQP connection状态。

  1. 启用 RabbitMQ 管理插件(便于调试):
sudo rabbitmq-plugins enable rabbitmq_management sudo systemctl restart rabbitmq-server

然后访问http://<server-ip>:15672,用openstack/RABBIT_PASS登录,检查/openstackvhost 下的 queues 是否有nova开头的队列(如novanova-cell0)生成。若无,说明 Nova 服务未成功注册,需回查日志。

2.4 依赖包:为什么必须用 apt 而非 pip 安装核心组件

Nova 的 Python 依赖极其复杂,涉及 200+ 个包,其中oslo.configoslo.dboslo.log等基础库对版本极其敏感。例如,oslo.db 12.0.0要求SQLAlchemy >= 1.4.0, < 2.0.0,而oslo.config 9.2.0又要求oslo.db >= 11.0.0。手动用 pip 安装极易陷入“依赖地狱”。

Ubuntu 官方仓库提供的python3-nova包,是经过 OpenStack Infra 团队 CI/CD 流水线严格验证的二进制分发版,其debian/control文件已精确锁定了所有依赖版本。安装命令为:

sudo apt update sudo apt install python3-nova python3-nova-common python3-nova-api \ python3-nova-scheduler python3-nova-conductor python3-nova-compute \ python3-nova-consoleauth python3-nova-novncproxy

这个命令会自动拉取并安装:

  • 核心服务二进制:/usr/bin/nova-api/usr/bin/nova-scheduler等;
  • 配置模板:/usr/share/nova/nova.conf.sample
  • systemd 服务文件:/lib/systemd/system/nova-*.service
  • 日志轮转配置:/etc/logrotate.d/nova

提示:不要尝试pip install --upgrade nova。这会覆盖 apt 安装的二进制,导致 systemd 服务无法启动(因为ExecStart路径指向/usr/bin/nova-api,而 pip 安装的在/usr/local/bin/)。若需升级,必须用apt upgrade python3-nova

3. 配置解析:nova.conf 不是参数清单,而是 Nova 的神经反射弧

/etc/nova/nova.conf是 Nova 的心脏,但它绝非简单的键值对集合。每一个 section(如[DEFAULT][api][database])都对应 Nova 架构中的一条关键神经通路,参数则是调节该通路信号强度与方向的旋钮。手动配置的难点,在于理解“为什么这个参数必须设在这里”“设错会导致什么生理反应”。下面我以四个最易出错的核心 section 为例,逐层拆解。

3.1[DEFAULT]:全局开关的连锁反应与默认值陷阱

[DEFAULT]section 控制 Nova 的全局行为,但很多参数的默认值在生产环境中是危险的。例如:

  • use_neutron = true:此参数决定网络管理由 Nova 自带的 nova-network(已废弃)还是 Neutron 处理。Yoga 版本中,use_neutron默认为false,但若你实际部署了 Neutron,却忘记显式设为true,则 Nova 会尝试加载已移除的 nova-network 驱动,启动时报错ModuleNotFoundError: No module named 'nova.network'

  • transport_url = rabbit://openstack:RABBIT_PASS@127.0.0.1:5672/openstack:这是 Nova 的“神经中枢连接线”。openstack是用户名,RABBIT_PASS是密码,/openstack是 vhost 名称,三者必须与 2.3 节中 RabbitMQ 配置完全一致。常见错误是漏掉 vhost 前缀/,写成rabbit://...@127.0.0.1:5672/openstack(少斜杠),此时 RabbitMQ 会将连接路由到默认 vhost/,而 Nova 服务在/下找不到队列,最终超时退出。

  • my_ip = 192.168.1.10:此参数定义本节点的管理 IP,用于nova-computenova-conductor注册自身能力。若设为127.0.0.1,则其他节点无法通过该 IP 访问 compute 服务,导致调度失败。实测中,若my_ip配置错误,nova service-list会显示该 compute 节点状态为down,但systemctl status nova-compute显示active (running),造成严重误导。

  • enabled_apis = osapi_compute,metadata:此参数开启的 API 类型,直接影响外部调用能力。osapi_compute提供 RESTful 计算 API(如创建实例),metadata提供实例元数据服务(如 cloud-init 获取 user-data)。若误删metadata,则所有通过 cloud-init 初始化的实例都无法获取 SSH 密钥,导致无法登录。

3.2[api]:REST 接口的性能与安全阀门

[api]section 专管 Nova-API 的 HTTP 层行为,两个参数关乎服务生死:

  • auth_strategy = keystone:Nova-API 的认证策略。必须设为keystone,否则所有 API 请求将绕过身份校验,任何人均可创建虚拟机,构成严重安全漏洞。若设为noauth2(仅开发测试用),nova list命令会返回空列表,因为客户端未携带 token,而服务端又不校验,导致权限上下文为空。

  • osapi_compute_workers = 4:此参数控制 API 服务的 worker 进程数,直接影响并发处理能力。计算公式为:CPU 核心数 × 1.5。例如,4 核服务器建议设为6。若设为1(默认值),在高并发请求下(如批量创建 100 台实例),API 会成为瓶颈,nova boot命令响应时间飙升至 30 秒以上,而 scheduler 和 compute 仍在空闲等待。实测数据显示,将 workers 从 1 提升至 6,API 吞吐量提升 4.2 倍。

3.3[database]:数据库连接的韧性设计

[database]section 不仅关乎能否连上,更关乎连接断开后的恢复能力:

  • connection = mysql+pymysql://nova:NovaPass123!@127.0.0.1/nova?charset=utf8mb4:如前所述,必须包含pymysql前缀和charset=utf8mb4

  • max_retries = 10:当数据库短暂不可用(如主从切换),Nova 会重试连接。默认值-1表示无限重试,但在生产环境可能导致服务长时间 hang 住。设为10,配合retry_interval = 10(每次重试间隔 10 秒),总等待时间约 100 秒,超时后服务主动退出,便于监控告警。

  • connection_recycle_time = 3600:此参数解决 MySQL 的wait_timeout问题。MySQL 默认wait_timeout=28800(8 小时),但 Nova 连接池中的空闲连接若超过此时间,MySQL 会主动断开,下次使用时报错Lost connection to MySQL server during query。设为3600(1 小时),确保连接在超时前被主动回收重连。

3.4[libvirt]:虚拟化驱动的硬件适配密钥

[libvirt]section 是nova-compute的灵魂,直接决定虚拟机能否真正运行:

  • virt_type = qemu:指定虚拟化类型。qemu(纯软件模拟)适用于无 VT-x/AMD-V 的环境,但性能极差;kvm(硬件加速)是生产首选。若 CPU 支持 KVM 但此处设为qemu,则nova boot后实例状态永远卡在buildingvirsh list --all查不到任何 domain。

  • cpu_mode = host-passthrough:此参数将宿主机 CPU 特性直接暴露给虚拟机,确保虚拟机内能运行 AVX-512 等高级指令。若设为custom且未指定cpu_models,则某些 AI 训练镜像会因检测不到 CPU 指令集而启动失败。

  • images_type = rbd:若后端存储是 Ceph,必须设为rbd,并配置[ceph]section。若误设为default(本地文件系统),则nova boot会报错NoValidHost: No valid host was found,因为 scheduler 根据images_type过滤 hosts,而 compute 节点实际配置的是 RBD,导致匹配失败。

提示:[libvirt]下的inject_password = false必须设为false。若为true,Nova 会尝试向虚拟机磁盘注入 root 密码,这在 UEFI 启动或加密磁盘场景下必然失败,且拖慢启动速度。现代云环境应使用 cloud-init 或 keypair 管理凭证。

4. 启动与验证:从服务状态到实例创建的全链路压测

配置完成后,启动 Nova 服务看似简单,但真正的挑战在于验证每一步是否真正生效。很多教程止步于systemctl start nova-api,却未告诉你如何确认它已进入健康状态。下面我提供一套从进程、日志、API 到实例的四级验证法,确保你的 Nova 不是“假活”。

4.1 第一级验证:systemd 服务状态与进程树

启动所有服务:

sudo systemctl enable --now \ nova-api nova-scheduler nova-conductor \ nova-novncproxy nova-consoleauth # 若为 compute 节点,额外启动: sudo systemctl enable --now nova-compute

检查状态:

sudo systemctl status nova-api | grep "Active:" # 应输出:Active: active (running) since ...

active (running)不代表健康。必须检查进程树:

ps aux | grep nova-api | grep -v grep # 正常输出应包含: # nova 12345 0.0 2.1 123456 7890 ? S 10:00 0:01 /usr/bin/python3 /usr/bin/nova-api --config-file /etc/nova/nova.conf

若只看到nova-api --config-file ...而无--config-file参数,则说明服务未加载配置,可能因/etc/nova/nova.conf权限错误(应为644,属主root:root)。

4.2 第二级验证:日志中的心跳信号与错误模式识别

Nova 日志是诊断黄金来源,位于/var/log/nova/。关键日志文件:

  • nova-api.log:记录所有 API 请求与响应;
  • nova-scheduler.log:记录调度决策过程;
  • nova-compute.log:记录虚拟机生命周期事件。

启动后,立即检查nova-scheduler.log

sudo tail -f /var/log/nova/nova-scheduler.log | grep "Starting scheduler manager"

若 30 秒内无输出,说明transport_url配置错误,服务卡在 AMQP 连接。

再检查nova-compute.log

sudo tail -f /var/log/nova/nova-compute.log | grep "Registering"

正常应输出:INFO nova.compute.manager Registering the service with the conductor。若无此日志,说明my_ip或数据库连接失败。

注意:日志中出现WARNING不一定代表错误。例如WARNING nova.scheduler.host_manager [instance: ...] Instance not found是正常现象,表示 scheduler 查询一个不存在的实例。但ERRORCRITICAL必须清零。

4.3 第三级验证:OpenStack CLI 的端到端 API 调用

安装 OpenStack 客户端:

sudo apt install python3-openstackclient

配置环境变量(admin-openrc):

export OS_PROJECT_DOMAIN_NAME=Default export OS_USER_DOMAIN_NAME=Default export OS_PROJECT_NAME=admin export OS_USERNAME=admin export OS_PASSWORD=ADMIN_PASS export OS_AUTH_URL=http://127.0.0.1:5000/v3 export OS_IDENTITY_API_VERSION=3 export OS_IMAGE_API_VERSION=2

执行验证命令:

  1. openstack compute service list:应列出所有 nova-* 服务,状态为up,状态为enabled
  2. openstack flavor list:应返回m1.tinym1.small等默认规格;
  3. openstack image list:需提前上传镜像(如 Cirros),否则为空;
  4. openstack network list:需 Neutron 配置,若未部署,此命令会报错,属正常。

最关键的验证是创建实例:

openstack server create --flavor m1.tiny --image cirros-0.6.2-x86_64-disk \ --nic net-id=NETWORK_ID --security-group default \ --key-name mykey test-instance

观察nova list输出:状态应从BUILD变为ACTIVE。若卡在BUILD超过 2 分钟,检查nova-compute.log中是否有libvirtError: internal error: process exited while connecting to monitor,这通常意味着virt_type配置错误或 KVM 模块未加载。

4.4 第四级验证:实例内部的连通性与功能完整性

实例变为ACTIVE后,还需验证其内部功能:

  1. 获取实例控制台日志:openstack console log show test-instance,确认内核启动无 panic;
  2. 获取 VNC URL:openstack console url show test-instance,用浏览器打开,应看到 Cirros 登录提示;
  3. SSH 登录(需提前配置 keypair):ssh -i ~/.ssh/mykey cirros@INSTANCE_FLOATING_IP,成功登录后执行cat /proc/cpuinfo | grep flags,确认输出包含vmx(Intel)或svm(AMD),证明 KVM 加速生效;
  4. 测试网络:ping -c 4 8.8.8.8,若失败,检查nova-compute节点的 iptables 规则是否放行br-int网桥流量。

提示:若实例能 ping 通外网但无法解析域名,检查/etc/resolv.conf是否被 cloud-init 正确写入 DNS 服务器。Nova 默认不管理 DNS,需在nova.conf[DEFAULT]中配置dhcp_domain = openstacklocal,并确保 dnsmasq 服务正常运行。

5. 常见故障排查:从日志碎片到根因定位的完整思维链

手动部署 Nova 的终极考验,不是能否装上,而是当服务报错时,能否在海量日志中快速定位根因。下面我复现三个真实生产环境高频故障,展示从现象到根因的完整排查链路,这不是罗列解决方案,而是还原一个资深运维的思考过程。

5.1 故障现象:nova service-list显示 compute 节点状态为down,但systemctl status nova-compute显示active (running)

第一步:确认服务进程存活

ps aux | grep nova-compute | grep -v grep # 输出正常,进程 PID 存在

说明 systemd 层面无问题,问题在 Nova 内部健康检查。

第二步:检查 compute 节点向 conductor 的注册日志

sudo grep "conductor" /var/log/nova/nova-compute.log | tail -5 # 输出:ERROR nova.servicegroup.api ... Failed to get service status from conductor

这表明 compute 节点无法与 conductor 通信。

第三步:验证 conductor 服务状态与网络连通性

# 在 compute 节点执行: curl -v http://CONDUCTOR_IP:8774 # 若返回 "Connection refused",说明 conductor 未监听或防火墙拦截

检查 conductor 节点:

sudo ss -tlnp | grep :8774 # 若无输出,说明 nova-api 未启动或配置了错误的 bind_host

查看/etc/nova/nova.conf[api]section:

bind_host = 127.0.0.1 # 错误!应为 0.0.0.0 或管理 IP

bind_host设为127.0.0.1导致 API 只监听本地回环,compute 节点无法访问。修正为bind_host = 0.0.0.0,重启nova-api

5.2 故障现象:openstack server create后实例状态卡在BUILDnova-compute.log报错NoValidHost: No valid host was found

第一步:提取调度失败的详细原因

sudo grep "NoValidHost" /var/log/nova/nova-scheduler.log | tail -1 # 输出:NoValidHost: No valid host was found. Reason: No host found meeting the requirements.

但未说明具体缺什么。

第二步:启用 scheduler 调试日志
编辑/etc/nova/nova.conf,在[DEFAULT]下添加:

debug = true log_level = DEBUG

重启nova-scheduler,重新触发创建。

第三步:分析 scheduler 的过滤日志

sudo grep "Filtering" /var/log/nova/nova-scheduler.log | tail -10 # 输出:DEBUG nova.filters [req-...] Filtering hosts: ['compute1'] with filters: [AvailabilityZoneFilter, ComputeFilter, ComputeCapabilitiesFilter, ImagePropertiesFilter, ServerGroupAntiAffinityFilter]

继续查:

sudo grep "ComputeFilter" /var/log/nova/nova-scheduler.log | tail -5 # 输出:DEBUG nova.filters [req-...] ComputeFilter: Host compute1 fails. Reason: cpu_info is None

cpu_info is None表明nova-compute未上报 CPU 信息。

第四步:检查 compute 节点的资源上报

sudo grep "Updating resource" /var/log/nova/nova-compute.log | tail -5 # 若无输出,说明资源上报失败

检查/etc/nova/nova.conf[DEFAULT]

# 缺少以下关键配置: report_interval = 30

report_interval控制 compute 向 conductor 上报资源的频率,默认0表示不上报。设为30(秒),重启nova-compute

5.3 故障现象:实例创建成功,但 VNC 控制台无法连接,页面显示Failed to connect to server (code: 1006)

第一步:确认 novncproxy 服务状态

sudo systemctl status nova-novncproxy # Active: active (running)

第二步:检查 novncproxy 日志中的 WebSocket 连接

sudo grep "WebSocket" /var/log/nova/nova-novncproxy.log # 输出:INFO nova.novncproxy.websockify [req-...] handler connected

说明 WebSocket 连接建立成功。

第三步:检查 compute 节点的 VNC 配置与端口监听

# 在 compute 节点执行: sudo ss -tlnp | grep :5900 # 若无输出,说明 libvirt 未启动 VNC

检查/etc/nova/nova.conf[vnc]section:

enabled = true server_listen = 0.0.0.0 server_proxyclient_address = COMPUTE_IP # 必须是 compute 节点的管理 IP

server_proxyclient_address若设为127.0.0.1,则 novncproxy 会尝试连接本地,而非 compute 节点,导致连接失败。修正后重启nova-compute

经验总结:Nova 故障排查的本质,是理解其三层通信模型

  • 控制平面(HTTP API):由 nova-api 处理,问题多在 Keystone 认证、网络连通性;
  • 调度平面(AMQP 消息):由 scheduler/conductor/compute 通过 RabbitMQ 协作,问题多在 transport_url、vhost 权限;
  • 数据平面(libvirt 直连):由 nova-compute 直接操作 KVM,问题多在 virt_type、cpu_mode、VNC 配置。
    每次报错,先判断属于哪一层,再针对性检查,可节省 70% 的排查时间。

6. 进阶实践:从单节点到多节点集群的平滑演进路径

手动安装 Nova 的终极目标,不是跑通一个 demo,而是构建可扩展、可维护的生产集群。很多教程止步于单节点 all-in-one,但真实环境必然是控制节点(controller)、网络节点(network)、计算节点(compute)分离部署。下面我给出一条经过 12 个客户验证的平滑演进路径,让你从单节点起步,逐步扩展为高可用集群。

6.1 第一阶段:单节点 All-in-One(验证核心链路)

在一台机器上部署所有 Nova 服务(api/scheduler/conductor/novncproxy/consoleauth)和一个 compute 服务。这是学习原理的黄金环境,但必须明确其局限性:

  • 数据库单点:MySQL 无主从,宕机即服务中断;
  • 消息队列单点:RabbitMQ 无镜像队列,崩溃后消息丢失;
  • 计算单点:所有实例运行在同一物理机,资源争抢严重。

此阶段重点验证:API 调用、实例创建、VNC 访问、日志追踪。一旦 `openstack server create