使用 Docker Swarm 结合 AWS Spot 实例降低 70% 成本
解读
面试官想考察三件事:
- 你是否真的在国内落地过 Swarm + Spot,而不是纸上谈兵;
- 你对成本模型是否敏感,能把 70% 这个数字算出来、讲清楚;
- 你是否能在稳定性与成本之间做权衡,给出可回滚、可观测、合规的方案。
回答时务必先算账、再讲架构、最后给兜底方案,否则会被追问“70% 怎么来的?丢了节点怎么办?”
知识点
- 国内 Spot 现状:AWS 中国区 Spot 价格平均为 On-Demand 的 10–20%,但库存波动大,需结合北京/宁夏双 Region 自动漂移。
- Swarm 弹性模型:Manager 必须稳定,Worker 可随 Spot 伸缩;Swarm 的Raft 共识容忍 (N-1)/2 故障,Manager 不能跑在 Spot。
- 标签与约束:
node.labels.lifecycle=spot+node.labels.lifecycle=on-demand,服务用--constraint做分层调度。 - 优雅回收:Auto Scaling Group 收到 Termination Notice 后,通过Lifecycle Hook 调用 SSM RunCommand 执行
docker node update --availability drain,再把 Pod 迁走;Hook 超时设为 120 s,足够 Swarm 重新调度。 - 镜像预热:Spot 节点启动脚本里先
docker pull最新镜像,避免冷启动拉取超时;镜像放在国内 ECR 加速地址(.cn-north-1.amazonaws.com.cn),并开 Cross-Region Replication 防单点。 - 成本核算公式:
原成本 = On-Demand 单价 × 24 h × 30 d × 实例数
新成本 = Spot 单价 × 24 h × 30 d × 实例数 + 20% On-Demand 保底 + 5% 额外监控与 Hook 费用
代入国内 c5.2xlarge 北京区近期价:On-Demand 3.2 元/小时,Spot 0.6 元/小时,10 台跑一个月,可降 (3.2×10×720 - (0.6×8×720 + 3.2×2×720)) / (3.2×10×720) ≈ 72%,数字可信。 - 合规与可观测:
- 日志走 Fluent Bit + Kinesis Firehose 到宁夏区 S3,落地前做 KMS 加密,满足等保 2.0;
- Spot 回收事件通过 EventBridge + SNS + 钉钉 Webhook 推送,5 min 内响应;
- 预算控制用 AWS Budgets + Service Quotas,单 Region Spot vCPU 上限锁死 80%,防止账单失控。
答案
“我在上一家公司用 Swarm+Spot 把批处理集群成本降了 72%,核心做法是‘稳管节点、弹性工作节点、提前镜像、快速漂移’四步。
第一步,把 3 台 Manager 固定成 c5.xlarge On-Demand,并开 Multi-AZ,确保 Raft 高可用;Worker 全部用 Spot,机型选 c5.2xlarge 和 m5.2xlarge 混布,利用 ASG 的容量再平衡策略自动补位。
第二步,给节点打标签,核心服务 MySQL、Redis 用 --constraint node.labels.lifecycle==on-demand 强制落在稳态节点;无状态微服务用 --constraint node.labels.lifecycle==spot 跑在 Spot,单服务副本数 ≥3 且跨 AZ 分布,容忍单节点瞬间消失。
第三步,Lifecycle Hook 捕获 Termination Notice,调用 SSM 文档执行 docker node update --availability drain && sleep 90,保证容器优雅终止;同时把节点从 Swarm 移除,防止调度器继续分配任务。
第四步,镜像预热与缓存:AMI 里预置了 docker pull $(aws ecr describe-images --repository-api xxx --query 'imageTags[0]') 的 UserData,并挂载 100 GB NVMe 本地盘做 docker-data 目录,减少拉取时间 60%。
最后通过 AWS Budgets 设 5000 元/月阈值,超支就关 Spot ASG,确保财务可控。整个方案跑 6 个月,节点被回收 400 多次,业务零中断,成本从每月 4.8 万降到 1.3 万,降幅 72.9%,数字经得起审计。”
拓展思考
- 如果 Spot 价格突然高于 On-Demand,如何秒级切换?
答:可给 ASG 配 混合实例策略,优先级 Spot→RI→On-Demand,并设 Spot 最大价为 On-Demand 的 80%,触发即自动 fallback;Swarm 侧提前把服务副本数设成 2×最小值,保证切换瞬间仍有容量。 - 国内客户要求双活容灾,Swarm 本身无跨 Region 联邦,怎么玩?
答:用 Terraform + Route 53 权重 在北京/宁夏各建一套 Swarm,镜像通过 ECR Cross-Region Replication 同步;上层 DNS 50:50 分流,底层数据库用 DTS 双向同步,RPO<30 s。 - 未来想迁到 EKS,如何平滑过渡而不重复投入?
答:把 Swarm Stack 先改成 Compose v3 规范,再用 Kompose 一键生成 Kubernetes YAML;网络策略提前用 Calico CRD 描述,等 EKS NodeGroup 也采用混合实例+Spot 方案,成本模型可复用,迁移周期从 3 个月压缩到 3 周。