$ aws ec2 request-spot-instances --instance-count 10 --type persistent
想象一下,你的渲染农场或者大数据批处理任务能便宜 90% 运行。Spot Instances 就是这个"折扣天堂"——AWS 用空闲容量给你打折,但代价是随时可能被回收。今天我们来看看怎么安全地用好 Spot Instances。
Spot Instances 工作原理
AWS 将闲置的 EC2 容量拿出来拍卖:
- 价格 = Spot Price —— 由供需关系动态决定(通常是 On-Demand 的 10-60%)
- 当容量被回收 —— AWS 提前 2 分钟发送中断信号
- 适合容错工作负载 —— 能接受中断并恢复的任务
Spot vs On-Demand vs RI 对比
| 特性 | On-Demand | Reserved | Spot |
|---|---|---|---|
| 价格 | 全价 | 6折 | 1-4折 |
| 中断风险 | 零 | 零 | 有(2分钟告警) |
| 容量保障 | 有 | 有 | 无(随时可能失败) |
| 适用场景 | 关键业务 | 稳定基线 | 批处理/容错 |
| 灵活性 | 最高 | 低 | 中 |
Spot 适用场景
最佳场景
- 大数据批处理 —— Spark、Hadoop、EMR 作业
- CI/CD 构建节点 —— Jenkins、GitHub Actions runner
- 机器学习训练 —— 超参数调优、模型训练
- 视频渲染/媒体处理 —— 可拆分作业
- 科学计算 —— 天气预报、基因分析
- 高性能计算(HPC) —— 集群式 Spot
不适合场景
- 需要 SLA 保证的在线服务
- 延迟敏感的交互式应用
- 数据库主节点(写操作密集)
- 不能接受状态丢失的有状态应用
Spot 竞价策略
1. 手动竞价(One-Time)
设置你的心理价位:
aws ec2 request-spot-instances \ --instance-count 5 \ --type "one-time" \ --spot-price "0.05" \ --launch-specification file://spec.json
2. 持续请求(Persistent Request)
Spot 回收后自动重新竞价:
aws ec2 request-spot-fleet \ --spot-fleet-request-config file://fleet-config.json
3. Spot Fleet(推荐生产使用)
Spot Fleet 可以:
- 自动在多个实例类型和 AZ 之间分配
- 自动用 On-Demand 补充 Spot 容量不足
- 保持目标容量恒定
处理 Spot 中断的正确方式
1. 监控中断信号
AWS 提供两种中断通知方式:
- EC2 事件 —— instance-action 和 spot-instance-action 事件
- Spot Instance Feeding Signal —— 元数据端点获取
# 获取中断提示(元数据) curl http://169.254.169.254/latest/meta-data/instance-action
2. 优雅关闭流程
在你的应用中添加 graceful shutdown:
# 收到中断信号后的处理脚本 /usr/bin/save-checkpoint.sh # 保存进度 /usr/bin/notify-batch-manager.sh # 通知调度器 /usr/bin/sleep 90 # 给足 2 分钟缓冲 /usr/bin/shutdown.sh # 安全关机
3. 使用 Checkpointing 和 Retry
设计你的作业时考虑:
- 小任务粒度 —— 每个任务控制在 5-30 分钟内完成
- 定期保存状态 —— 每 2-5 分钟检查点保存
- 幂等设计 —— 任务可以从检查点恢复,不重复计算
- 重试机制 —— 作业调度器自动重试失败任务
Spot + Auto Scaling Group 集成
现代架构推荐组合:
- ASG 中配置 Spot 和 On-Demand 混合
- 使用 Spot Fleet 分配策略
- 配合 Capacity Rebalancing 自动补充容量
成本计算示例
假设你需要 100 个 vCPU 运行机器学习训练任务:
- 纯 On-Demand:m5.large x 50 = 100 vCPU, $4.8/h
- Spot 策略:平均 Spot 价格 60% off, $1.92/h
- 每天运行 8 小时,节省:$23/天, $6,900/月
关键要点:
- Spot 是成本最低的 EC2 选项,适合容错工作负载
- 使用 Spot Fleet 管理多个实例类型和 AZ
- 实现优雅关闭和 checkpointing 处理中断
- 配合 On-Demand/RI 作为基线,Spot 处理峰值
- 批处理、ML 训练、CI/CD 是最佳用例
Spot Instances 是云成本优化的"秘密武器",用得好可以帮你省下 60-90% 的计算费用!