云原生-06-OpenStack测试环境最常见的部署镜像和网络问题怎么排查

在 OpenStack 测试环境里,最容易先讨论的是:

  • Nova、Neutron、Glance、Cinder 分别负责什么
  • 虚机怎么创建
  • 浮动 IP 怎么绑
  • 安全组和路由怎么配

这些概念当然重要,但测试现场最常见的并不是“概念不会”,而是下面这些更具体的问题:

  • 虚机创建成功了,但一直 ACTIVE 不起来
  • 镜像能启动,但拿不到 IP 或者远程连不上
  • 同一份镜像,在 A 项目网络正常,在 B 项目网络异常
  • 浮动 IP 已绑定,业务端口还是不通
  • 平台明明显示实例正常,测试任务却无法真正落到目标虚机

这说明 OpenStack 在测试环境里的难点,不只是创建资源,而是:

把部署链路、镜像准备、网络连通性和排障证据收成一条可以快速闭环的运维链路。

这篇文章只聚焦一个问题:

OpenStack 测试环境里最常见的部署、镜像和网络问题应该怎么拆层、怎么排、怎么收证据。

一、先把问题拆成三层

OpenStack 测试环境里的很多故障之所以越查越乱,通常是因为没有先把问题分层。

更适合现场的拆法是:

  • 部署层:实例有没有真正创建成功,调度有没有落到可用宿主机
  • 镜像层:镜像本身是否可启动、cloud-init 是否生效、驱动是否匹配
  • 网络层:固定 IP、浮动 IP、安全组、路由、DNS 是否一致

1. 部署层:实例是否真的具备运行条件

需要先确认:

  • 目标 flavor 是否有足够资源
  • 宿主机是否还有 CPU、内存、磁盘配额
  • 实例状态是不是停在 BUILDERRORSHELVED_OFFLOADED
  • 卷启动还是本地盘启动

很多“虚机起不来”的问题,根因根本不在镜像,而在资源调度或配额。

2. 镜像层:能启动不等于可用

镜像层最常见的失真是:

  • 操作系统起来了,但网卡名和模板预期不一致
  • cloud-init 没有正确注入用户、公钥、主机名
  • 镜像里缺少 qemu-guest-agent
  • 新做的镜像把旧的网卡配置也打进去了

这一层必须回答:

  • 启动日志里是否有 cloud-init 报错
  • 镜像内网卡、路由、DNS 是否自动生效
  • 实例控制台能否正常进入系统

3. 网络层:流量到底卡在了哪一段

OpenStack 网络问题最容易被误判成“虚机没起来”。实际更常见的是:

  • DHCP 正常,但安全组挡住了端口
  • 安全组正常,但浮动 IP 没绑到正确端口
  • 浮动 IP 绑定成功,但上游路由或 NAT 没打通
  • 固定 IP 可以互通,外部网络不通

更有效的排查方式不是问“通不通”,而是继续拆:

  • 实例是否拿到固定 IP
  • 租户网络是否可达网关
  • 端口是否关联正确安全组
  • 浮动 IP 是否映射到正确端口
  • 目标端口监听是否真正启动

二、测试环境里最常见的 6 类问题

1. 实例创建成功,但一直 SSH 不通

这类问题往往不是单点原因,而是下面几种情况之一:

  • 安全组没放行 22
  • 镜像没有正确注入 keypair
  • cloud-init 失效
  • 系统起来了,但 sshd 没启动
  • 浮动 IP 绑错端口

2. 镜像能启动,但网络配置错乱

典型现象包括:

  • 网卡名不一致导致静态配置失效
  • 镜像里遗留旧的 ifcfg-*netplan 配置
  • DNS 和路由没跟租户网络一起切换

3. 同样模板在不同项目网络里表现不一致

这种问题经常和下面几项有关:

  • 子网 DHCP 配置不同
  • MTU 不一致
  • 默认安全组策略不同
  • 外部网关路由策略不同

4. 实例能 ping 通,但业务端口不通

这通常说明:

  • 基础连通性没问题
  • 真正问题落在安全组端口、服务监听、反向代理或应用配置

5. 卷挂载成功,但启动后找不到数据

这类问题常见于:

  • 新旧盘 UUID 冲突
  • 挂载点没写入 fstab
  • 镜像里自动挂载脚本没适配新盘

6. 平台显示实例正常,但测试任务无法真正执行

这通常不是 OpenStack 控制面报错,而是平台没有把“实例 ACTIVE”继续收敛成:

  • SSH 可连
  • 端口可达
  • Agent 可启动
  • 依赖可访问

三、最小排查骨架

更适合现场使用的排查顺序如下。

1. 先看控制面状态

  • 实例状态
  • 端口状态
  • 卷状态
  • 配额和宿主机资源

2. 再看实例控制台和 cloud-init

  • 控制台是否卡在启动阶段
  • cloud-init 是否报错
  • 用户、公钥、网卡、DNS 是否注入成功

3. 再看网络分段

  • 固定 IP 是否拿到
  • 子网网关是否可达
  • 安全组是否放通
  • 浮动 IP 是否映射正确
  • 目标业务端口是否监听

4. 最后看平台执行条件

  • Agent 是否启动
  • 平台下发是否成功
  • 执行日志是否能回写

四、最小执行清单

下面这张清单更适合在测试环境里快速复用:

层级 检查项 目标
部署层 实例/卷/端口状态 确认资源已落地
镜像层 cloud-init、控制台、网卡配置 确认实例可进入系统
网络层 固定 IP、浮动 IP、安全组、监听端口 确认流量路径闭合
平台层 SSH、Agent、任务下发、日志回写 确认测试任务真正可执行

五、常见坑

1. 只看实例状态,不看控制台输出

实例 ACTIVE 并不代表操作系统真的准备好。

2. 用旧镜像直接克隆,不清理网络痕迹

旧的网卡、路由、cloud-init 状态如果残留,换环境后很容易出现隐蔽故障。

3. 只看浮动 IP,不看端口和安全组

很多“外网不通”最后根因都落在端口绑定和安全组规则。

4. 平台把实例可用等同于任务可用

实例起得来,不代表测试执行条件已经齐全。

5. 只保存平台侧报错,不保存控制台和网络证据

OpenStack 故障如果没有控制台日志、端口信息和网络截图,后续很难复盘。

六、真实案例:实例 ACTIVE,但测试平台始终连不上

1. 场景

某套测试环境新建了一批 OpenStack 实例,控制台显示实例均为 ACTIVE,平台也能查到固定 IP,但自动化任务一直卡在“连接目标主机失败”。

2. 执行

现场先看平台日志,报的是 SSH 超时;随后检查实例详情,发现浮动 IP 已绑定,安全组里也放通了 22 端口。

3. 现象

表面上像是网络偶发不通,但同批实例全部失败,说明更像系统性配置问题。

4. 排查

进一步查看实例控制台,发现 cloud-init 在启动阶段报网卡配置异常;进入控制台后确认镜像里保留了旧环境的静态网卡配置,新环境网卡名与旧环境不一致,导致实例虽然启动成功,但默认路由和 DNS 都没有正确生效。

5. 修复

现场先重做镜像初始化逻辑,清理旧网卡配置并恢复 cloud-init 接管网络;随后重新发版镜像,再次创建实例后 SSH 和平台任务恢复正常。复盘时补了三项动作:

  • 镜像发布前增加 cloud-init 自检
  • 实例验收增加固定 IP、默认路由、DNS 校验
  • 平台把“SSH 可连 + Agent 可启动”作为实例可用的真正门槛

七、结论

OpenStack 测试环境里的高频问题,很多并不是控制面本身太复杂,而是部署、镜像和网络三条链路没有先拆开。

更有效的处理方式通常是:

  • 先确认资源和调度是否成立
  • 再确认镜像是否真的适配当前网络
  • 最后把流量路径从固定 IP、浮动 IP、安全组到业务端口逐段走通

这样才能避免把所有问题都粗暴归到“OpenStack 不稳定”。