4. 计算实例运维与故障诊断

在 OCI 生产环境中,计算实例(Compute Instance)的运维与故障诊断围绕一条清晰的生命周期主线展开:Provisioning → Running → Stopping → Stopped → Starting → Running,以及异常分支 Terminating / Terminated。理解每个状态之间的合法迁移路径,是判断故障性质的第一步。例如,实例长时间停留在 Provisioning,通常意味着镜像拉取、网络配置或容量调度出现问题;而实例从 Starting 回退到 Stopped,则往往指向引导卷、启动脚本或串行控制台层面的错误。

实例生命周期中的关键状态包括:PROVISIONING(资源分配与初始化)、RUNNING(正常运行)、STOPPING(正常关机中)、STOPPED(已关机但资源保留)、STARTING(重新启动中)、TERMINATING(终止中)、TERMINATED(已释放)。需要特别注意的是,STOPPED 状态并不等于资源完全释放,引导卷、VNIC、公共 IP 等仍可能保留并计费;只有 TERMINATED 才会释放计算资源。生产运维中,应通过 OCI 控制台、CLI 或 API 定期核对实例状态与资源占用,避免“已关机但仍在计费”的隐性成本。

当实例启动失败时,诊断顺序应从外到内、从基础设施到操作系统逐层排查。第一层是实例状态与事件日志:通过控制台查看实例的“Work Requests”和“Instance Events”,确认是否有容量不足、镜像不可用、配额超限等平台侧错误。第二层是引导卷与启动脚本:检查引导卷是否挂载正常、启动脚本(cloud-init)是否执行成功。第三层是串行控制台:当实例无法通过 SSH 登录时,串行控制台是唯一能直接观察引导过程的手段。

示例:通过 OCI CLI 查看实例状态与事件

oci compute instance get \
  --instance-id ocid1.instance.oc1..example \
  --query 'data.{state:"lifecycle-state",shape:"shape",ad:"availability-domain"}'

oci compute instance list-events \
  --instance-id ocid1.instance.oc1..example \
  --query 'data[].{time:"timestamp",type:"event-type",state:"state"}'

上述命令用于确认实例当前生命周期状态及最近事件。示例中的 OCID 为占位符,实际使用时需替换为真实资源标识。

SSH 无法连接是生产环境中最常见的故障之一。排查时应区分三类原因:网络层(安全列表、NSG、路由表、网关)、实例层(实例未运行、VNIC 未配置、公共 IP 缺失)、操作系统层(sshd 未启动、密钥不匹配、防火墙规则、磁盘满)。建议按以下顺序验证:先确认实例状态为 RUNNING 且 VNIC 已附加;再检查子网安全列表是否放行 TCP 22;然后确认实例是否有公共 IP 或是否通过 Bastion 访问;最后通过串行控制台登录系统内部检查 sshd 服务与密钥文件权限。

快速判断:如果 ping 公共 IP 不通,问题大概率在网络层或实例未运行;如果 ping 通但 SSH 超时,问题在安全列表或 sshd;如果 SSH 返回“Permission denied (publickey)”,问题在密钥或用户配置。

串行控制台(Serial Console)是 OCI 提供的带外管理通道,即使实例网络完全不可用,只要实例处于 RUNNING 状态,就可以通过串行控制台查看引导日志、登录系统并执行修复命令。启用串行控制台需要满足两个条件:实例已配置串行控制台连接,且用户拥有相应 IAM 权限。连接方式支持 SSH 和 VNC 两种。生产排障中,串行控制台常用于修复 sshd 配置错误、恢复被误删的密钥、检查 cloud-init 日志、处理磁盘满导致的登录失败等场景。

实例控制台(Instance Console Connection)与串行控制台在概念上紧密相关,但侧重点不同:实例控制台连接是创建串行控制台访问的连接资源,而串行控制台是实际交互的终端会话。创建连接后,OCI 会返回一个连接字符串,运维人员通过该字符串建立 SSH 或 VNC 会话。若连接创建失败,通常需要检查实例是否支持串行控制台、IAM 策略是否允许、以及实例是否处于可连接状态。

OCI 计算实例生命周期与故障诊断路径 生命周期状态迁移 PROVISIONING RUNNING STOPPING STOPPED STARTING TERMINATED 启动成功 启动失败回退 启动失败诊断分层 第一层:平台侧 容量 / 配额 / 镜像 / Work Request 第二层:引导卷与脚本 引导卷挂载 / cloud-init / 启动脚本 第三层:串行控制台 引导日志 / 系统登录 / 修复命令 诊断顺序:从平台侧 → 引导卷 → 串行控制台,逐层缩小故障范围 SSH 无法连接排查树 实例状态 = RUNNING? VNIC / 公共 IP 正常? 安全列表放行 TCP 22? sshd 运行 / 密钥正确? 逐项验证,定位故障层 串行控制台与实例控制台连接 实例控制台连接 创建连接资源 串行控制台会话 SSH / VNC 交互终端 连接字符串 → 建立会话 → 查看引导日志 / 修复系统 适用场景:sshd 配置错误、密钥丢失、磁盘满、cloud-init 失败

在实际生产排障中,建议将上述诊断路径固化为标准操作流程。以下是一份可直接参考的检查清单,用于实例启动失败或 SSH 无法连接时的快速定位:

检查项 检查方法 正常预期 异常处理
实例生命周期状态 控制台 / CLI instance get RUNNING 若为 STOPPED,尝试启动并查看事件
Work Request 状态 控制台“Work Requests” SUCCEEDED 查看失败原因,检查配额与容量
VNIC 与公共 IP 控制台“Attached VNICs” 已附加且 IP 可用 重新分配公共 IP 或检查子网
安全列表 / NSG 检查入站规则 放行 TCP 22 添加规则并确认生效
串行控制台连接 控制台“Console Connection” ACTIVE 重新创建连接并获取连接字符串
系统内部 sshd 串行控制台登录后 systemctl status sshd active (running) 启动服务并检查配置

生产注意:串行控制台会话默认在闲置一段时间后断开,长时间操作时建议保持会话活跃。此外,串行控制台登录需要实例内已配置有效的用户凭据;若实例从未成功引导,可能无法登录,此时应优先检查引导卷和 cloud-init 日志。

综合来看,OCI 计算实例的运维与故障诊断应遵循“先状态、后网络、再系统”的层次化思路。生命周期状态是判断实例是否具备运行基础的前提;网络层排查解决连通性问题;串行控制台则是突破操作系统层故障的关键手段。将这三层与实例控制台连接资源的管理结合起来,就能在大多数生产故障场景中快速定位根因并恢复服务。