Google Cloud Spot VM的核心优势并不只是“便宜”,而是允许用户用较低的计算成本使用Google Cloud的闲置计算容量。Google目前公布的Spot VM价格最高可以比相应的标准按需VM低91%,实际价格会根据机器类型和区域等因素变化,因此不能简单理解成固定的五分之一或者十分之一价格。
代价也非常明确:Spot VM没有可用性保证。Google Cloud需要回收这些计算资源时,可以随时终止Spot VM。因此,真正适合Spot VM的任务通常具有一个共同特征:机器突然消失不会让整个业务陷入不可恢复的状态。
这也是判断Spot VM是否适合一个项目最重要的标准。与其问“这个程序能不能跑在Spot VM上”,不如问“如果这台机器现在消失,我的任务会发生什么”。如果答案是任务只是暂停、重新排队或者从最近一次checkpoint继续,那么Spot VM通常值得考虑;如果答案是用户交易中断、数据库状态损坏或者一次计算结果必须从头恢复,那么Spot VM就需要非常谨慎。
批处理是最典型的应用场景。ETL、日志处理、图片转换、视频转码、数据清洗、报表生成、科学计算和大规模文件处理,都可以把工作拆分成大量相对独立的任务。一个Worker被回收以后,调度系统可以重新创建实例,把尚未完成的任务重新安排到其他计算资源上。Google Cloud官方也将batch processing、HPC、数据分析、渲染和转码等列为Spot VM的典型应用。
这种架构的关键不是“让Spot VM永远不掉”,而是让单台机器的失败变得无关紧要。例如,一个视频转码任务已经把输入文件保存在Cloud Storage中,处理结果也写入持久化存储,那么某台Spot VM突然被回收,只意味着这个任务需要重新调度,而不是整个项目的数据消失。
机器学习训练也是Spot VM经常使用的场景,但这里必须比普通批处理更加谨慎。训练任务如果需要几个小时甚至几天才能完成,而中途丢失计算状态就必须从头开始,那么Spot VM的低价格可能很快被反复重跑的成本抵消。
比较可靠的做法是建立checkpoint机制,把模型权重、优化器状态以及必要的训练进度定期保存到持久化存储。当Spot VM被回收以后,新实例重新启动训练任务,再从最近一次checkpoint继续,而不是从零开始。对于分布式训练,还需要考虑worker数量变化、任务协调、通信和故障恢复。Spot VM本身并不会替训练框架自动完成这些事情。
GPU训练同样可以使用Spot VM。Google Cloud目前支持GPU Spot VM,但GPU资源的可用性和价格同样受到区域、机器类型和资源供应影响。对于可以checkpoint、能够重新调度、并且不要求训练节点永久存在的模型训练任务,Spot VM可能显著降低计算成本。
Kubernetes是另一类非常适合Spot VM的环境,因为容器化应用本身就比较容易设计成无状态和可重新调度。Google Kubernetes Engine(GKE)支持使用Spot VM建立节点池,也支持Autopilot中的Spot Pods。Google明确将stateless、batch和fault-tolerant workloads作为主要使用场景。
不过,“Kubernetes会自动迁移Pod”这句话也需要准确理解。被回收的节点不会神奇地把正在运行的进程搬到另一台机器上,而是节点消失以后,由Kubernetes根据Deployment、ReplicaSet、StatefulSet等控制机制重新创建和调度符合条件的Pod。因此,应用必须本身具有足够的副本、正确的健康检查和合理的持久化设计。
例如,一个Web API服务有多个副本,其中一部分运行在标准VM节点,另一部分运行在Spot节点。当一个Spot节点被回收时,只要集群还有足够的标准节点或其他可用Spot节点,Kubernetes可以重新安排Pod。Google也提供了让Spot节点与标准节点混合运行的机制,并可以通过taint、toleration和节点选择规则控制哪些工作负载可以进入Spot节点。
这里最不应该把核心基础设施全部建立在Spot VM上。Google的GKE文档明确建议保留使用标准VM的节点池,以便运行关键系统组件,例如DNS等。Spot节点适合承担可以被打断的计算工作,而不是成为整个集群唯一的生命线。
持续运行的生产数据库则属于完全不同的情况。数据库不仅需要计算资源,还需要稳定的存储、网络、故障恢复和一致性机制。如果一台Spot VM被突然回收,数据库能够否在另一台机器上可靠恢复,取决于数据库架构,而不是简单地取决于VM能不能重新启动。因此,对于核心数据库、关键交易系统以及无法容忍中断的状态型服务,标准VM或者更适合的托管数据库服务通常更容易满足可靠性要求。
存储设计同样决定了Spot VM是否安全。不要把唯一的一份重要数据放在临时计算实例的本地存储中。任务输入、checkpoint、中间结果以及最终结果,都应该根据业务要求放到Cloud Storage、Persistent Disk或其他适合的持久化存储中。尤其需要注意Local SSD,因为它属于与VM生命周期关系非常紧密的临时存储,不能把它当成永久数据保存位置。
同时还需要区分“计算任务可以丢失”和“数据可以丢失”。一台Spot VM可以被重新创建,并不意味着这台机器里面的数据可以随便消失。比较成熟的架构通常把计算节点当成可替换资源,把重要状态放到计算节点之外。这样,VM只是一个临时Worker,而不是数据的唯一载体。
Spot VM还有一个非常适合的场景,就是CI/CD和软件测试。编译大型项目、运行自动化测试、建立临时测试环境以及执行大量并行测试,都可能消耗大量CPU时间。如果一次测试失败只需要重新运行,而不会影响生产系统,那么使用Spot VM可以降低测试基础设施的成本。Google也将CI/CD列为Spot VM适合的计算工作负载。
渲染、科学计算、金融建模、基因数据处理和模拟计算也具有类似特点。这些任务通常可以拆成大量独立工作单元,每个计算节点完成一部分工作。某个节点消失以后,调度系统只需要重新安排未完成的部分,而不是让整个计算过程失效。Google Cloud官方列举的Spot VM应用范围就包括HPC、渲染、转码、基因组处理、金融建模和预测分析等。
反过来看,实时交易、关键数据库、单实例运行的状态型应用以及对中断极其敏感的服务,都不应该仅仅因为Spot VM便宜就迁移过去。如果一台机器消失以后没有备用实例,没有checkpoint,没有自动重试,也没有其他计算资源接管,那么节省下来的VM费用可能远远抵不过一次业务中断的损失。
Spot VM的另一个特点是,不能按照过去Preemptible VM的思路认为“24小时以后一定会被删除”。Google目前的Spot VM没有固定的最大运行时间,实例可以持续运行,直到Compute Engine需要重新获得这些资源,或者用户自己设置运行限制。
Google Cloud还会在需要回收资源时向实例发送终止通知,因此应用应该利用这段时间进行清理和保存状态。对于GKE,节点上的Pod也有相应的优雅终止机制;Autopilot的Spot Pods在回收时最多可以获得15秒的终止宽限时间,而标准GKE环境则有相应的节点终止处理机制。
因此,一个比较成熟的Spot VM架构通常不是“全部使用Spot”,而是把计算资源分成不同层次。关键服务使用标准VM,能够重试的Worker使用Spot VM;核心节点保证基本容量,Spot节点负责降低成本和吸收计算峰值。当Spot容量不足或者被大量回收时,系统仍然能够利用标准VM继续工作。
最终,判断Spot VM是否适合一个任务,可以用几个非常实际的问题来检查:机器消失以后任务能不能重新执行?重要状态有没有保存在VM之外?任务有没有checkpoint?有没有自动重试和重新调度?系统是否拥有标准VM作为后备计算能力?如果这些问题都能回答清楚,那么Spot VM通常就不仅仅是“便宜的服务器”,而是一种经过架构设计后可以被主动利用的计算资源。
Spot VM真正的价值,从来不是保证一台便宜的虚拟机一直运行,而是把“机器可能消失”这个事实纳入系统设计。对于批处理、渲染、测试、HPC、机器学习训练和无状态容器服务,计算节点本来就应该是可以替换的。只要数据、任务状态和调度能力不依赖某一台机器,VM被回收就不再是一场事故,而只是一次普通的资源变化。
Google Cloud Spot VM 适合什么场景,哪些任务可以承受实例被回收
图片说明:示意图 图片来源:Public Domain(公有领域)
喜欢这篇报道?
使用下面的功能,方便以后继续阅读和分享 MNewsTV
关于文章收藏
收藏不需要注册帐号,收藏信息仅保存在当前浏览器中。
删除收藏请进入「我的收藏」进行管理。
捐助(Paypal): https://www.paypal.me/observeccp 订阅中国观察电报 Telegram : https://t.me/s/ObserveCCP