OpenStack生产云平台运维、升级与故障排查
OpenStack把计算、网络、存储、身份、镜像和编排组合成私有云。一次虚拟机创建会跨越Keystone、Nova、Neutron、Glance、Placement、消息队列、数据库和存储后端。生产排障必须沿请求ID和状态机定位,不能只重启某个服务。
一、核心服务
- Keystone:身份与Token;
- Nova:计算与实例生命周期;
- Neutron:网络、端口、路由和安全组;
- Glance:镜像;
- Cinder:块存储;
- Placement:资源库存与分配;
- Horizon:控制台;
- RabbitMQ:服务间消息;
- MariaDB/Galera:控制面数据库;
- Octavia:负载均衡;
- Swift/Ceph:对象或统一存储后端。
二、控制面故障域
生产通常至少三个控制节点,分别保证:
- API负载均衡;
- 数据库多数派;
- RabbitMQ仲裁;
- Keystone和缓存;
- 各服务Scheduler/Conductor;
- 时间和DNS。
三节点不代表能随意同时维护两个节点。数据库、消息队列和服务选主有各自多数派要求。
三、统一请求追踪
OpenStack日志通常包含Request ID。排障时从CLI/API响应获取ID,在Nova、Neutron、Cinder等日志中串联。
openstack --debug server create ...
grep -R '<request-id>' /var/log/nova /var/log/neutron
统一时钟是关联日志的前提。所有节点使用可靠NTP/Chrony。
四、虚拟机创建链路
Keystone认证
↓
Nova API创建Build Request
↓
Placement选择资源
↓
Scheduler选择计算节点
↓
Conductor与Compute执行
↓
Glance取镜像
↓
Neutron创建端口
↓
Cinder挂载卷(可选)
实例卡在BUILD/ERROR时按状态、Fault、调度日志和计算日志逐段定位。
五、调度失败
常见 NoValidHost:
- vCPU、内存或磁盘不足;
- Placement库存不同步;
- Aggregate/AZ不匹配;
- Trait或资源类缺失;
- NUMA、HugePage、CPU Pinning条件无法满足;
- PCI/SR-IOV资源不足;
- 计算服务Disabled/Down。
openstack compute service list
openstack hypervisor list
openstack resource provider list
openstack allocation candidate list --resource VCPU=2 --resource MEMORY_MB=4096
不要通过删除Placement Allocation来“快速修复”,先确认实例和资源真实状态。
六、Nova计算节点
监控:
- nova-compute心跳;
- Libvirt/QEMU;
- CPU/NUMA/内存超分;
- 本地临时盘;
- 实例状态与Hypervisor实际状态;
- 迁移任务;
- Console;
- 网络和存储连接。
计算节点维护先Disable调度,再迁移或疏散实例,确认清空后维护。
七、实例疏散
Evacuate用于计算节点故障后在其他节点重建实例。前提包括共享存储或可重建根盘、目标容量和网络可用。
执行前确认原节点确实不可恢复并隔离,避免同一实例双开。疏散后检查磁盘一致性、端口、卷挂载和应用状态。
八、Neutron网络
排障路径:
虚拟机网卡
→ TAP/veth
→ Linux Bridge/OVS/OVN
→ 隧道或Provider网络
→ 物理网卡
→ 交换机
检查端口状态、Binding、Security Group、DHCP、Metadata、Router、Namespace、OVS/OVN流表、隧道和物理VLAN。
九、DHCP与Metadata
虚拟机无地址时检查:
- Neutron端口和MAC;
- DHCP Agent或OVN DHCP;
- Network Namespace;
- dnsmasq;
- 安全组和交换流表;
- MTU;
- 云初始化日志。
获取不到Metadata会导致SSH Key、主机名和Cloud-init失败,但网络本身可能已经可用。
十、安全组
安全组规则最终转化为iptables、OVS或OVN ACL。控制面显示规则存在不代表数据面已安装。
排障同时查看:
- 端口绑定;
- 远端组成员;
- 数据面规则;
- Conntrack;
- 状态回程;
- 主机内防火墙。
十一、Cinder块存储
卷创建或挂载失败可能位于API、Scheduler、Volume Service、后端存储、iSCSI/RBD/NVMe-oF或计算节点Connector。
openstack volume service list
openstack volume show <volume-id>
openstack server show <server-id>
不要随意在数据库修改卷状态。先确认后端是否存在、是否已映射、是否被主机使用,避免双重挂载或数据损坏。
十二、Glance镜像
治理:
- 镜像来源、哈希和签名;
- 可见范围;
- 属性与架构;
- 后端存储;
- 镜像缓存;
- 废弃和删除;
- 漏洞扫描;
- 大镜像下载性能。
镜像删除前检查是否仍用于自动扩容、模板和灾备。
十三、RabbitMQ
RabbitMQ异常会导致API请求接受后后台无响应。
监控:
- 节点与仲裁;
- 队列长度;
- Unacked;
- 连接和Channel;
- 内存/磁盘水位;
- 网络分区;
- 消费速率;
- 消息年龄。
不要在未知状态下同时重启全部RabbitMQ节点。
十四、数据库与Galera
关注:
- 集群成员和Primary Component;
- wsrep状态;
- 流控;
- SST/IST;
- 慢SQL和锁;
- 连接数;
- 备份;
- 数据库增长。
控制服务数据库需一致备份。跨服务恢复时要考虑资源状态关联,不能随意恢复单张表。
十五、配额与资源泄漏
用户看到“资源不足”可能是配额,也可能是Placement Allocation、Neutron Port、Cinder Attachment等残留。
排查:
- 项目配额;
- 实际资源;
- 删除中/错误状态对象;
- Placement分配;
- 数据库与后端状态;
- 最近失败操作。
清理孤儿资源前必须交叉验证对象ID和后端。
十六、监控体系
层次:
- API可用性和延迟;
- 服务进程和心跳;
- 消息队列与数据库;
- 资源池与配额;
- 计算、网络、存储数据面;
- 虚拟机创建、挂载、分配浮动IP等合成操作;
- 业务租户体验。
只有进程监控无法发现“API正常但无法创建虚拟机”。
十七、备份范围
- 各服务数据库;
/etc配置与密钥;- Keystone Fernet Key;
- TLS证书;
- RabbitMQ定义和必要状态;
- Glance镜像;
- Cinder/Swift/Ceph数据保护;
- Provider网络和硬件配置;
- Kolla/Ansible/Puppet等部署代码;
- Secrets和Inventory。
恢复顺序要考虑身份、数据库、消息队列、API和数据面依赖。
十八、升级原则
OpenStack由多个项目组成,必须按当前发行版官方文档和部署工具规划。
升级前:
- 阅读Release Notes与升级检查;
- 验证源/目标版本路径;
- 完成数据库和配置备份;
- 集群健康;
- 预留容量;
- 测试环境演练;
- 客户端/API兼容;
- 数据库Migration时间评估。
十九、滚动升级
一般流程:
- 控制面和数据库前置检查;
- 升级控制服务;
- 执行数据库Expand迁移;
- 分批升级计算/网络/存储节点;
- 完成数据迁移;
- Contract迁移;
- 验证合成业务;
- 清理旧服务。
具体顺序依部署方式和版本而定,不能把通用流程当作命令手册。
二十、安全
- 管理API与公网隔离;
- Keystone最小权限和MFA;
- Service Credential定期轮换;
- Fernet Key正确同步和轮换;
- TLS覆盖API和内部服务;
- Metadata防SSRF;
- 镜像可信;
- 租户网络隔离;
- 管理员操作审计;
- Secrets不进入Git明文。
二十一、上线检查清单
- [ ] 控制面、数据库和消息队列跨故障域;
- [ ] Request ID可跨服务检索;
- [ ] Placement、配额和后端资源一致性受监控;
- [ ] Nova、Neutron、Cinder有分层Runbook;
- [ ] 合成创建虚拟机、网络和卷测试持续运行;
- [ ] 配置、数据库、密钥和数据后端均有备份;
- [ ] 计算节点维护和疏散经过演练;
- [ ] 升级路径、插件和部署工具兼容;
- [ ] API、租户与管理身份最小权限;
- [ ] 控制节点、计算节点、消息队列和存储故障已演练。
二十二、结语
OpenStack排障的核心是沿请求ID和资源状态机跨服务追踪。不要用重启所有控制服务替代定位,也不要直接修改数据库状态掩盖资源不一致。只有把控制面、消息队列、数据库和数据面同时纳入监控与恢复,私有云才能真正可运营。
参考资料
- OpenStack Documentation:https://docs.openstack.org/
- OpenStack 2026.2:https://docs.openstack.org/2026.2/