
1. 项目概述为什么Nova的手动安装不是“装个软件”那么简单Nova是OpenStack云平台的计算服务核心它不只是一段能跑起来的代码而是一套精密协同的分布式系统——它要和Keystone握手认证身份要向Placement上报资源库存要调用Glance拉取镜像要通过Neutron分配网络还要把虚拟机实例真正落在物理宿主机上。所以“实训项目6 Nova的手动安装与配置”表面看是执行几条命令、改几个配置文件实则是一次对整个OpenStack控制平面逻辑的深度解剖。我带过十几期云计算实训班发现80%的学员卡在“能装上但跑不通”问题从来不在apt install nova-api这行命令本身而在于没搞懂每个配置项背后的服务契约比如[placement]段里填的auth_url不是随便写个IP加端口就行它必须和Keystone里为placement服务注册的endpoint完全一致再比如[api_database]里的连接串密码错了会报错但密码对了、数据库没提前创建好用户权限照样启动失败——错误日志里只会冷冰冰地写“connection refused”根本不会告诉你“你漏建了keystone数据库用户”。这个项目真正的价值是逼你亲手把OpenStack的“神经网络”一根线一根线接通。它适合两类人一类是刚学完理论、想验证概念的高校学生另一类是准备考OCPCOpenStack Certified Professional的工程师——因为考试里所有故障排查题90%都源于手动部署时踩过的坑。别被标题里的“手动”二字骗了这不是复古怀旧而是为了让你看清自动部署工具比如DevStack或Kolla背后到底在帮你掩盖什么。2. 整体架构设计与关键依赖拆解2.1 Nova在OpenStack中的定位与协作关系Nova不是孤岛它是OpenStack控制平面的“中枢神经”。它的运行严格依赖四个外部服务缺一不可且每个依赖都有明确的协议和数据流向Keystone提供统一身份认证。Nova所有API请求必须携带Keystone颁发的token否则直接拒绝。更关键的是Nova自身也要作为Keystone的一个服务service注册并拥有自己的service user如nova用户和endpoint如http://controller:8774/v2.1。很多初学者以为配好[keystone_authtoken]就完了却忘了在Keystone里执行openstack service create --name nova --description OpenStack Compute compute这条注册命令结果Nova服务启动后日志里满屏报“Failed to discover available identity versions”。Placement管理计算资源库存。这是Newton版本后引入的核心组件彻底取代了旧版Nova的scheduler本地资源追踪。Placement独立部署Nova通过REST API实时上报宿主机的CPU、内存、磁盘等可用资源并在调度时查询Placement获取最优节点。如果Placement服务没启动或者Nova配置里[placement]段的auth_url指向错误Nova-api进程能起来但创建虚拟机时会卡在“scheduling”状态日志里只有一句No valid host was found根本看不出是Placement的问题。Glance提供镜像服务。Nova不存储镜像只负责调用Glance API下载指定ID的镜像到计算节点本地。因此[glance]段的api_servers必须指向Glance的endpoint且Nova的service usernova必须有Glance的读取权限。曾有个学员把Glance endpoint配成http://localhost:9292结果在计算节点上部署Nova时它试图连自己本机的9292端口——而Glance实际部署在controller节点自然超时失败。DatabaseMySQL/PostgreSQL持久化元数据。Nova需要两个独立数据库nova_api存API相关数据如flavor、aggregatenova或nova_cell0存实例状态等核心数据。注意这不是一个库两个表而是两个物理库且必须分别初始化。很多教程一笔带过“创建nova数据库”却没强调要执行两次CREATE DATABASE nova_api CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;和CREATE DATABASE nova CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;导致后续nova-manage api_db sync成功但nova-manage db sync报错“no such table”。提示手动部署的本质是“逆向工程”。当你看到nova.conf里有[keystone_authtoken]段就要立刻反推Keystone里是否已创建nova用户是否已赋予admin角色是否已将nova用户加入service项目这些步骤在自动部署中由脚本完成手动时必须逐条验证。2.2 控制节点与计算节点的职责分离Nova服务横跨两类节点配置差异极大混淆会导致灾难性后果控制节点Controller Node部署nova-api、nova-scheduler、nova-conductor三个服务。其中nova-api是唯一对外提供REST接口的入口nova-scheduler负责决策“把VM放在哪台物理机”它不接触宿主机只和Placement、数据库通信nova-conductor是安全代理代替nova-compute直接操作数据库避免计算节点获得数据库root权限。因此控制节点的nova.conf中enabled_apis必须包含osapi_compute,metadata且[DEFAULT]下的compute_driver应设为libvirt.LibvirtDriver仅用于API校验实际不启动libvirt。计算节点Compute Node只部署nova-compute服务。它才是真正和KVM/QEMU打交道的组件必须安装libvirt-daemon,qemu-kvm等底层虚拟化包。其nova.conf中[DEFAULT]的compute_driver必须是libvirt.LibvirtDriver且[libvirt]段需精确配置virt_type kvm非qemu、cpu_mode host-passthrough提升性能。最关键的差异在数据库连接计算节点的nova.conf里绝不能配置[database]段因为nova-compute不直连数据库所有数据操作都通过nova-conductor代理。若误配nova-compute启动时会疯狂尝试连数据库拖垮整个DB服务。注意网络热词里频繁出现的“keystone变换”“placement”并非独立技术而是Nova依赖链上的关键环节。“keystone变换”实指Keystone的token鉴权流程“placement”则是资源调度的数据源。忽略它们Nova就像没有驾照的司机——车能点火但上不了路。2.3 为什么坚持“手动”而非用DevStackDevStack一键部署固然快但它把所有服务塞进单机用screen管理进程配置文件全在/opt/stack下路径和权限全是特例。而企业级OpenStack必然是多节点分离部署数据库用独立MySQL集群消息队列用RabbitMQ集群存储用Ceph。手动安装强迫你直面真实生产环境的约束配置文件路径必须是/etc/nova/nova.conf而非/opt/stack/nova/etc/nova/nova.conf日志必须输出到/var/log/nova/并按nova-api.log、nova-compute.log分离服务必须用systemd管理systemctl enable nova-api而非screen -S n-api ./run_server.sh。 我见过太多学员用DevStack跑通demo后面对客户要求的三节点部署手足无措——因为DevStack隐藏了节点间证书分发、防火墙端口开放、SELinux上下文配置等真实运维细节。这个实训项目就是撕掉那层“自动化糖衣”让你看见骨头。3. 核心配置详解与参数原理3.1 Keystone认证模块的深度配置Nova与Keystone的对接远不止填个URL和密码。[keystone_authtoken]段是整个信任链的起点每个参数都承载着明确的安全语义[keystone_authtoken] auth_url http://controller:5000/v3 memcached_servers controller:11211 auth_type password project_domain_name Default user_domain_name Default project_name service username nova password NOVA_PASSauth_url必须是Keystone v3 API的完整URL。v2和v3的token格式完全不同填错直接导致Invalid token format。验证方法在控制节点执行curl -i http://controller:5000/v3返回HTTP 200且含version: {id: v3}即正确。memcached_serversKeystone默认启用token缓存Nova通过memcached加速token校验。若省略此行每次API调用都要走网络连Keystone性能暴跌。实测数据显示开启缓存后API响应时间从320ms降至45ms。注意memcached必须在controller节点安装并启动且防火墙放行11211端口。auth_type password明确指定使用密码认证非token或cert。这是最常用模式但必须确保username和password与Keystone中nova用户的凭证完全一致。生成密码时切忌用简单字符串应执行openssl rand -hex 10生成16位随机密钥。project_name servicenova用户必须属于service项目而非admin项目这是OpenStack的RBAC最佳实践。在Keystone中执行openstack project show service确认项目存在再用openstack user role add --user nova --role admin --project service赋予权限。实操心得配置完务必验证。在控制节点执行openstack --os-auth-url http://controller:5000/v3 --os-project-name admin --os-username admin --os-password ADMIN_PASS --os-user-domain-name Default --os-project-domain-name Default --os-identity-api-version 3 token issue若返回token则Keystone连通。再用该token测试Novacurl -H X-Auth-Token: TOKEN http://controller:8774/v2.1/os-services返回JSON列表即Nova API可用。3.2 Placement服务的精准对接Placement是Nova调度的“大脑”其配置错误会导致VM永远卡在scheduling状态。[placement]段必须与Placement服务的部署严格匹配[placement] os_region_name RegionOne project_domain_name Default project_name service auth_type password username placement password PLACEMENT_PASS auth_url http://controller:5000/v3os_region_name必须与Keystone中Placement服务注册的region一致。执行openstack endpoint list | grep placement查看输出中Region列的值此处必须完全相同大小写敏感。username和passwordPlacement服务在Keystone中必须有独立的placement用户且该用户属于service项目。常见错误是复用nova用户的密码导致Placement API返回401 Unauthorized。auth_url必须指向Keystone v3且端口为5000非35357后者是旧版admin端口。Placement不支持v2 API。验证Placement连通性的黄金命令# 获取placement用户的token export OS_AUTH_URLhttp://controller:5000/v3 export OS_PROJECT_NAMEservice export OS_USER_DOMAIN_NAMEDefault export OS_PROJECT_DOMAIN_NAMEDefault export OS_USERNAMEplacement export OS_PASSWORDPLACEMENT_PASS openstack token issue # 用token查询资源提供者应返回空列表或已有节点 curl -H X-Auth-Token: TOKEN http://controller:8778/resource_providers若返回{resource_providers: []}说明Placement服务正常若返回{error: {code: 401...}}则一定是[placement]段的认证参数与Keystone中placement用户信息不匹配。3.3 数据库连接的双库隔离策略Nova强制要求两个独立数据库这是为了解耦API元数据与核心实例数据提升可维护性数据库名用途初始化命令同步命令nova_api存储flavor、aggregate、quotas等API层数据nova-manage api_db sync必须先执行nova或nova_cell0存储instances、compute_nodes等核心数据nova-manage db sync在api_db sync之后执行创建数据库与用户必须用root用户登录MySQL执行CREATE DATABASE nova_api CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE DATABASE nova CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; GRANT ALL PRIVILEGES ON nova_api.* TO novalocalhost IDENTIFIED BY NOVA_DBPASS; GRANT ALL PRIVILEGES ON nova_api.* TO nova% IDENTIFIED BY NOVA_DBPASS; GRANT ALL PRIVILEGES ON nova.* TO novalocalhost IDENTIFIED BY NOVA_DBPASS; GRANT ALL PRIVILEGES ON nova.* TO nova% IDENTIFIED BY NOVA_DBPASS; FLUSH PRIVILEGES;注意nova%允许其他节点如计算节点连接这是多节点部署的必需。配置文件中的连接串在nova.conf中[api_database]和[database]段必须分别指向两个库[api_database] connection mysqlpymysql://nova:NOVA_DBPASScontroller/nova_api [database] connection mysqlpymysql://nova:NOVA_DBPASScontroller/nova关键点mysqlpymysql驱动比mysql更稳定尤其在高并发场景密码必须用NOVA_DBPASS而非NOVA_PASS后者是Keystone密码。常见陷阱同步数据库时若nova-manage api_db sync成功但nova-manage db sync失败90%概率是nova数据库未创建或权限不足。此时不要反复执行sync先检查mysql -u nova -pNOVA_DBPASS -h controller nova -e show tables;若报错“Access denied”说明权限配置有误。3.4 计算节点Libvirt驱动的硬核调优计算节点的[libvirt]段是性能瓶颈所在参数不当会导致VM启动慢、迁移失败、甚至宿主机宕机[libvirt] virt_type kvm cpu_mode host-passthrough ram_allocation_ratio 1.5 disk_allocation_ratio 1.0 live_migration_uri qemussh://nova%s/systemvirt_type kvm必须显式指定不能留空。qemu模式性能极差仅用于调试。验证方法egrep -c (vmx|svm) /proc/cpuinfo若返回大于0说明CPU支持硬件虚拟化KVM可用。cpu_mode host-passthrough将宿主机CPU特性直接暴露给VM性能提升30%以上。替代方案host-model会模拟较老CPUcustom需手动指定CPU型号均不如passthrough。ram_allocation_ratio内存超分比例。设为1.5表示允许分配1.5倍物理内存的VM。但必须配合宿主机的vm.overcommit_memory1内核参数否则OOM Killer会干掉VM进程。生产环境建议保守设为1.0~1.2。live_migration_uri热迁移的SSH通道。%s会被替换为目标宿主机名因此必须确保nova用户在所有计算节点间配置了免密SSHssh-copy-id novacompute2。若用qemutcp需额外配置libvirtd监听TCP安全性更低。实操心得修改[libvirt]参数后必须重启libvirtd服务systemctl restart libvirtd。否则Nova-compute仍使用旧配置。曾有个案例因忘记重启libvirtdcpu_mode始终是custom导致VM无法识别AVX指令集AI训练任务直接崩溃。4. 完整实操流程与关键步骤解析4.1 环境准备与基础服务部署在开始Nova安装前必须确保底层服务已就绪。这不是可选步骤而是前置硬性条件操作系统与网络所有节点使用Ubuntu 22.04 LTS或CentOS 8 Stream禁用firewalldsystemctl stop firewalld systemctl disable firewalld关闭SELinuxsetenforce 0 sed -i s/SELINUXenforcing/SELINUXdisabled/g /etc/selinux/config。网络配置要求controller节点有10.0.0.11/24管理网compute节点有10.0.0.31/24且彼此ping通。安装NTP服务时间不同步会导致Keystone token校验失败。在controller节点apt install chrony -y systemctl enable chrony systemctl start chrony # 修改/etc/chrony/chrony.conf添加allow 10.0.0.0/24 systemctl restart chrony在compute节点修改/etc/chrony/chrony.conf将pool行注释添加server controller iburst然后systemctl restart chrony。部署MySQL在controller节点安装MySQL 8.0apt install mysql-server python3-pymysql -y # 编辑/etc/mysql/mysql.conf.d/mysqld.cnf添加 [mysqld] bind-address 10.0.0.11 default-storage-engine innodb innodb_file_per_table on max_connections 4096 collation-server utf8mb4_general_ci character-set-server utf8mb4重启MySQLsystemctl restart mysql。部署RabbitMQ消息队列是Nova组件间通信的管道apt install rabbitmq-server -y rabbitmqctl add_user openstack RABBIT_PASS rabbitmqctl set_permissions openstack .* .* .* # 启用管理插件便于监控 rabbitmq-plugins enable rabbitmq_management部署Memcached为Keystone token缓存提供支持apt install memcached python3-memcache -y # 修改/etc/memcached.conf将-l 127.0.0.1改为-l 10.0.0.11 systemctl restart memcached注意所有服务安装后必须用ss -tlnp | grep :PORT验证端口监听状态。例如MySQL应监听10.0.0.11:3306RabbitMQ监听*:5672Memcached监听10.0.0.11:11211。任何端口未监听后续Nova服务必然失败。4.2 Keystone服务的安装与配置Keystone是整个信任体系的根必须首先部署且绝对准确安装与数据库初始化apt install keystone apache2 libapache2-mod-wsgi-py3 python3-openstackclient -y # 创建keystone数据库 mysql -u root -p -e CREATE DATABASE keystone CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; mysql -u root -p -e GRANT ALL PRIVILEGES ON keystone.* TO keystonelocalhost IDENTIFIED BY KEYSTONE_DBPASS; mysql -u root -p -e GRANT ALL PRIVILEGES ON keystone.* TO keystone% IDENTIFIED BY KEYSTONE_DBPASS;配置/etc/keystone/keystone.conf[database] connection mysqlpymysql://keystone:KEYSTONE_DBPASScontroller/keystone [token] provider fernet [cache] backend dogpile.cache.memcache enabled true memcache_servers controller:11211初始化与启动# 初始化数据库 su -s /bin/sh -c keystone-manage db_sync keystone # 初始化Fernet密钥 keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone keystone-manage credential_setup --keystone-user keystone --keystone-group keystone # 引导bootstrap创建admin用户、service项目等 keystone-manage bootstrap --bootstrap-password ADMIN_PASS \ --bootstrap-admin-url http://controller:5000/v3/ \ --bootstrap-internal-url http://controller:5000/v3/ \ --bootstrap-public-url http://controller:5000/v3/ \ --bootstrap-region-id RegionOne # 配置Apache ln -s /usr/share/keystone/wsgi-keystone.conf /etc/apache2/sites-enabled/keystone.conf systemctl restart apache2创建service用户与endpointexport OS_USERNAMEadmin export OS_PASSWORDADMIN_PASS export OS_PROJECT_NAMEadmin export OS_USER_DOMAIN_NAMEDefault export OS_PROJECT_DOMAIN_NAMEDefault export OS_AUTH_URLhttp://controller:5000/v3 export OS_IDENTITY_API_VERSION3 openstack service create --name keystone --description OpenStack Identity identity openstack endpoint create --region RegionOne identity public http://controller:5000/v3 openstack endpoint create --region RegionOne identity internal http://controller:5000/v3 openstack endpoint create --region RegionOne identity admin http://controller:5000/v3关键验证执行openstack token issue若返回token则Keystone部署成功。若报错Connection refused检查Apache是否运行、端口5000是否监听若报错Unauthorized检查bootstrap密码是否与--bootstrap-password一致。4.3 Placement服务的独立部署Placement是Nova调度的基石必须单独部署且与Keystone深度集成安装Placementapt install placement-api -y # Ubuntu 22.04中placement-api包已包含所有依赖配置/etc/placement/placement.conf[DEFAULT] debug false [api] auth_strategy keystone [keystone_authtoken] auth_url http://controller:5000/v3 memcached_servers controller:11211 auth_type password project_domain_name Default user_domain_name Default project_name service username placement password PLACEMENT_PASS [placement_database] connection mysqlpymysql://placement:PLACEMENT_DBPASScontroller/placement创建Placement数据库与用户mysql -u root -p -e CREATE DATABASE placement CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; mysql -u root -p -e GRANT ALL PRIVILEGES ON placement.* TO placementlocalhost IDENTIFIED BY PLACEMENT_DBPASS; mysql -u root -p -e GRANT ALL PRIVILEGES ON placement.* TO placement% IDENTIFIED BY PLACEMENT_DBPASS;同步数据库并启动服务# 同步placement数据库 su -s /bin/sh -c placement-manage db sync placement # 重启Apacheplacement通过WSGI运行 systemctl restart apache2在Keystone中注册Placement服务# 创建placement用户 openstack user create --domain default --password PLACEMENT_PASS placement # 将placement用户加入service项目并赋予admin角色 openstack role add --project service --user placement admin # 创建placement服务实体 openstack service create --name placement --description Placement API placement # 创建placement endpoint openstack endpoint create --region RegionOne placement public http://controller:8778 openstack endpoint create --region RegionOne placement internal http://controller:8778 openstack endpoint create --region RegionOne placement admin http://controller:8778验证要点执行placement-status upgrade check应返回Upgrade check: Success执行curl -H X-Auth-Token: $(openstack token issue -f value -c id) http://controller:8778/resource_providers返回空JSON数组即成功。若返回404检查Apache的placement配置是否加载若返回401检查[keystone_authtoken]参数。4.4 Nova服务的分节点部署4.4.1 控制节点部署nova-api, nova-scheduler, nova-conductor安装Nova组件apt install nova-api nova-scheduler nova-conductor python3-novaclient -y配置/etc/nova/nova.conf关键部分[DEFAULT] transport_url rabbit://openstack:RABBIT_PASScontroller my_ip 10.0.0.11 use_neutron true firewall_driver nova.virt.firewall.NoopFirewallDriver [api_database] connection mysqlpymysql://nova:NOVA_DBPASScontroller/nova_api [database] connection mysqlpymysql://nova:NOVA_DBPASScontroller/nova [placement] os_region_name RegionOne project_domain_name Default project_name service auth_type password username placement password PLACEMENT_PASS auth_url http://controller:5000/v3 [keystone_authtoken] auth_url http://controller:5000/v3 memcached_servers controller:11211 auth_type password project_domain_name Default user_domain_name Default project_name service username nova password NOVA_PASS [glance] api_servers http://controller:9292 [oslo_concurrency] lock_path /var/lib/nova/tmp初始化数据库# 同步api数据库 su -s /bin/sh -c nova-manage api_db sync nova # 同步主数据库 su -s /bin/sh -c nova-manage db sync nova # 注册cell0必须在db sync之后 su -s /bin/sh -c nova-manage cell_v2 map_cell0 nova # 创建cell1并注册 su -s /bin/sh -c nova-manage cell_v2 create_cell --namecell1 --verbose nova # 发现计算节点此时只有controller后续会添加compute su -s /bin/sh -c nova-manage cell_v2 discover_hosts --verbose nova启动服务# 启用并启动nova服务 systemctl enable nova-api nova-scheduler nova-conductor systemctl start nova-api nova-scheduler nova-conductor4.4.2 计算节点部署nova-compute安装依赖apt install nova-compute python3-novaclient -y # 安装KVM虚拟化套件 apt install cpu-checker -y kvm-ok # 应输出KVM acceleration can be used apt install qemu-kvm libvirt-daemon-system virtinst virt-manager -y配置/etc/nova/nova.conf计算节点专用[DEFAULT] transport_url rabbit://openstack:RABBIT_PASScontroller my_ip 10.0.0.31 # compute节点IP use_neutron true firewall_driver nova.virt.firewall.NoopFirewallDriver # 注意计算节点不配置[database]段 # [database]段必须完全删除或注释 [api_database] connection mysqlpymysql://nova:NOVA_DBPASScontroller/nova_api [placement] os_region_name RegionOne project_domain_name Default project_name service auth_type password username placement password PLACEMENT_PASS auth_url http://controller:5000/v3 [keystone_authtoken] auth_url http://controller:5000/v3 memcached_servers controller:11211 auth_type password project_domain_name Default user_domain_name Default project_name service username nova password NOVA_PASS [glance] api_servers http://controller:9292 [oslo_concurrency] lock_path /var/lib/nova/tmp [libvirt] virt_type kvm cpu_mode host-passthrough ram_allocation_ratio 1.5 disk_allocation_ratio 1.0 live_migration_uri qemussh://nova%s/system启动nova-compute服务# 确保libvirtd运行 systemctl enable libvirtd systemctl start libvirtd # 启用并启动nova-compute systemctl enable nova-compute systemctl start nova-compute在控制节点注册计算节点# 在controller节点执行发现新计算节点 su -s /bin/sh -c nova-manage cell_v2 discover_hosts --verbose nova # 查看计算节点列表 openstack compute service list # 应看到nova-compute在compute节点上状态为up实操心得nova-manage cell_v2 discover_hosts命令必须在controller节点执行且需确保nova.conf中[placement]配置正确。若执行后openstack compute service list中compute节点状态为down检查compute节点的nova-compute.log90%是[placement]认证失败或transport_url连不上RabbitMQ。5. 常见问题与排查技巧实录5.1 Nova服务启动失败的典型原因与诊断当systemctl start nova-api失败时不要盲目重启按以下顺序排查现象日志线索journalctl -u nova-api -n 50 -f根本原因解决方案Failed to load configuration file/var/log/nova/nova-api.log中无日志journalctl显示Permission deniednova用户无/etc/nova/nova.conf读取权限chown nova:nova /etc/nova/nova.conf chmod 644 /etc/nova/nova.confConnection to database failed日志中pymysql.err.OperationalError: (1045, Access denied for user novacontroller)MySQL用户权限未授权nova%mysql -u root -p -e GRANT ALL ON nova_api.* TO nova%; FLUSH PRIVILEGES;Unable to establish connection to http://controller:5000/v3keystone_authtoken相关错误Connection refusedKeystone服务未运行或5000端口未监听systemctl status apache2检查netstat -tlnpNo module named keystoneauth1Python导入错误python3-openstackclient未安装或版本冲突apt install python3-openstackclient卸载pip install的版本排查技巧用strace跟踪进程启动过程。例如strace -f -e traceopenat,connect,sendto systemctl start nova-api 21 | grep -E (openat|connect|sendto)可精准定位是打开哪个配置文件失败还是连接哪个服务超时。5.2 虚拟机创建卡在scheduling状态这是Nova部署中最经典的疑难杂症90%与Placement相关第一步确认Placement服务健康执行placement-status upgrade check若返回Failure说明Placement数据库未同步或版本不匹配执行su -s /bin/sh -c placement-manage db sync placement。第二步检查计算节点是否注册到Placement执行openstack resource provider list应看到controller和compute节点的resource provider。若只有controller说明nova-compute未成功上报资源。检查compute节点的/var/log/nova/nova-compute.log搜索report若无日志检查[placement]配置若有401 Unauthorized检查placement用户密码。第三步验证Placement API可访问性在compute节点执行# 获取token TOKEN$(openstack --os-auth-url http://controller:5000/v3 --os-project-name service --os-username placement --os-password PLACEMENT_PASS --os-user-domain-name Default --os-project-domain-name Default token issue -f value -c id) # 查询资源提供者 curl -H X-Auth-Token: $TOKEN http://controller:8778/resource_providers若返回{resource_providers