实例生命周期
实例在任何时刻都恰好处于八种状态之一。它处于哪种状态决定了你关心的三件事:你能否连上它、它是否在向你计费,以及有哪些操作可用。
状态机
正常路径是 creating → running → stopping → stopped → starting → running。拆除过程始终是 destroying → destroyed,并且可以从 running、stopped 或 error 开始。
没有其他合法的迁移。请求当前状态不允许的操作——启动一个已经在运行的实例、停止一个还在创建中的实例——会被拒绝,实例保持原状。
每一种状态
| 状态 | 过渡态 | 计费 | 含义 |
|---|---|---|---|
creating | 是 | 无 | 切片已经预留,你的工作负载正在首次启动。 |
starting | 是 | 无 | 已停止的实例正在同一台机器上、用同一块磁盘恢复。 |
running | 否 | GPU,按秒 | 工作负载已就绪。SSH、JupyterLab 和你发布的端口都可以访问。 |
stopping | 是 | 无 | 容器正在关闭。你的磁盘会被保留。 |
stopped | 否 | 磁盘,按 GB 每小时 | 没有任何东西在执行。磁盘和 GPU 槽位仍然为你占着。 |
destroying | 是 | 无 | 容器和磁盘正在被拆除。 |
destroyed | 否 | 无 | 终态。磁盘已经没了,报价回到市场。 |
error | 否 | 无 | 实例无法启动。见下文。 |
过渡态是平台正在主动推进的那四种状态;控制台会用脉动的徽章显示它们,并在推进期间更频繁地刷新。它们会自行结束——没有什么可点,也没有什么操作需要重试。
非过渡态是稳定的。实例会一直停在 running、stopped、destroyed 或 error,直到你或计费系统让它动起来。
每次迁移由什么引起
| 迁移 | 触发条件 |
|---|---|
→ creating | 你执行部署:带上一份报价、一个模板和一个磁盘大小调用 POST /v1/instances。 |
creating/starting → running | 工作负载上报自己已就绪。GPU 计量从这里开始,而不是从部署时开始。 |
creating/starting → error | 工作负载无法启动。 |
running → stopping | 你停止了它,或者你的余额到了 $0。 |
stopping → stopped | 关闭已完成。磁盘计量从这里开始。 |
stopped → starting | 你启动了它。要求余额为正。 |
running/stopped/error → destroying | 你销毁了它,或者你的余额到了 −$5。 |
destroying → destroyed | 拆除已完成。磁盘被删除,报价被释放。 |
其中两个触发条件不是你发起的。当组织的余额归零时,运行中的实例会被自动停止;如果余额继续跌到 −$5,所有实例都会被销毁。两者都在 自动停止与自动销毁 中讲到。
部署和启动都要求余额大于零。停止和销毁则从不要求——无论余额是多少,你随时都能把东西关掉。
计费跟随状态
费用按实例实际所处状态的费率结算,而且每一次状态变化都会在生效之前先结清此前欠下的部分。GPU 计量只在 running 时运行。磁盘计量只在 stopped 时运行。四种过渡态、error 和 destroyed 都是免费的。
这就是为什么一次花两分钟才启动起来的部署不会为这两分钟计费,也是为什么已停止的实例仍然每分钟在你的账本里产生一条扣费。
“error”是什么意思
error 意味着平台无法把你的工作负载启动起来——镜像拉取失败、容器拒绝启动,或者主机在启动过程中停止上报。
由此有四个结论:
- 不会向你计费。 在
error状态下计量是关闭的,实例停在那里不会累计任何费用。 - 它不会自行恢复。 没有自动重试。实例会一直停在
error,直到你采取行动。 - 报价仍被占着。 在实例到达
destroyed之前,切片不会被释放回市场。 - 销毁是唯一能做的操作。 你无法启动、停止或修复一个出错的实例。销毁它,排除原因,然后重新部署。
常见原因出在模板上而不是硬件上:一个不存在的镜像名或标签,或者一个凭据填错的私有镜像仓库。如果 ssh 或 jupyter 模板用的镜像不是基于 Superheat 基础镜像构建的,同样启动不起来,因为这两种模式依赖基础镜像的 entrypoint。
从未到达过 running 的实例没有日志可读,所以要从模板而不是从实例入手排查。故障排查 逐一讲了具体的失败情形。
它不产生费用,但别人租不了那块切片,你也无法重新部署到它上面。销毁它,让切片回到市场。
你在哪里看到状态
实例 页面会列出除已销毁实例之外的一切。通过 API,GET /v1/instances?include_destroyed=true 可以把它们带回来。
每个实例页面会以徽章显示当前状态,只展示当前状态允许的操作——已停止的实例上是启动,运行中的实例上是停止,运行中、已停止或出错的实例上是销毁——并在工作负载就绪之后,在它的 连接 标签页显示连接信息。