本节摘要:计算服务是云上"机器"的根。三家云在"虚机、容器、K8s 集群"三种部署形态上各自有产品矩阵,但命名、计费单位、调度粒度差异巨大。本节给一张三栏对照表 + "什么时候用虚机、什么时候用 K8s"的决策依据。学完本节,你能在面对"上 ECS 还是上 K8s"这种工程决策时给出有理有据的判断。

阅读完本节,你应当能够:
K8s 是云原生的"标准答案"——但答案不一定对。
举一个反例:某团队为了"拥抱云原生"把一个 3 个微服务的内部系统迁到 K8s。结果 6 个月后:集群管理员要学 30 个 K8s 概念(Pod、Deployment、Service、Ingress、ConfigMap、Secret、PV、PVC、StatefulSet、DaemonSet、Job、CronJob、NetworkPolicy、HPA、VPA、Cluster Autoscaler、Helm、Operator、CRD、Admission Controller...),还上了 Prometheus + Grafana + EFK + Istio + Argo CD 监控栈。整个迁移花了 200 人天,而系统 QPS 从来没超过 100。
正解:3 个微服务、日均 1 万请求的业务,直接用 3 台 ECS + Nginx 反代 + RDS 即可,K8s 完全是过度工程化。K8s 的复杂度只有在"微服务 ≥ 10 个、QPS ≥ 1000、团队 ≥ 5 人"时才划算。
| 维度 | 虚机(IaaS) | 托管容器 | K8s 集群 |
|---|---|---|---|
| 启动时间 | 1-3 分钟 | 30 秒 | 1-2 分钟(Pod 启动) |
| 资源利用率 | 30-50% | 60-80% | 70-90% |
| 运维复杂度 | 低 | 中 | 高 |
| 可移植性 | 低(与云绑定) | 中(容器镜像可移植) | 高(K8s 标准) |
| 适用规模 | 任意 | 5-50 微服务 | 20+ 微服务 |
| 学习曲线 | 1 天 | 1 周 | 1 个月 |
| 典型代表 | EC2 / ECS / CVM | Fargate / 弹性容器实例 / EKelet | EKS / ACK / TKE |
| 部署形态 | AWS | 阿里云 | 腾讯云 |
|---|---|---|---|
| 虚机 | EC2(Elastic Compute Cloud) | ECS(Elastic Compute Service) | CVM(Cloud Virtual Machine) |
| 托管容器 | Fargate(搭配 ECS/EKS) | 弹性容器实例 ECI | EKelet(Serverless 容器) |
| K8s 集群 | EKS(Elastic Kubernetes Service) | ACK(Container Service for Kubernetes) | TKE(Tencent Kubernetes Engine) |
| 裸金属 | EC2 Bare Metal | ECS Bare Metal | CVM Bare Metal |
| GPU 实例 | P3/P4/G4/G5 | GN5/GN6/GN7 | GN10X/GN7 |
某电商 2020 年的架构演进:
| 阶段 | 时间 | 部署形态 | 微服务数 | 月基础设施成本 |
|---|---|---|---|---|
| 阶段 1 | 2020 Q1 | 5 台 ECS + 1 个 RDS | 3 | 8000 元 |
| 阶段 2 | 2021 Q2 | 20 台 ECS + K8s on ECS | 12 | 28000 元 |
| 阶段 3 | 2022 Q3 | 阿里云 ACK 托管 + ECI 弹性 | 25 | 35000 元(弹性扩容) |
| 阶段 4 | 2023 Q4 | ACK + Fargate 模式 + 自动扩缩 | 30 | 25000 元(弹性优化) |
关键转折:阶段 3 用了托管 K8s,省掉了 1 个全职 SRE 工资;阶段 4 引入 ECI 做弹性扩容,秒杀期间 5 分钟扩容到 100 Pod,活动结束自动释放。
| 业务特征 | 推荐部署 | 理由 |
|---|---|---|
| 微服务 ≤ 3 个、日均 ≤ 1 万 QPS | 虚机(ECS) | K8s 是过度工程化 |
| 微服务 5-20 个、流量有规律 | 托管 K8s(ACK/TKE) | 平衡运维和弹性 |
| 微服务 20+ 个、流量大峰谷 | K8s + Fargate/ECI | 极致弹性 |
| 短任务(CI/CD、批处理) | Fargate/ECI/EKelet | 按秒计费 |
| AI/ML 训练 | GPU 虚机(按需) | GPU 资源池化 |
| 传统 Java 单体应用 | 虚机 + Tomcat 自管 | 没必要容器化 |
| 反例 | 后果 | 正解 |
|---|---|---|
| 3 个微服务上 K8s | 运维成本超过收益 | 直接用虚机 + Docker Compose |
| 没有监控上 K8s | 出问题不知道怎么排查 | 先有 Prometheus + Grafana |
| 没有 CI/CD 上 K8s | 镜像手动 kubectl apply | 先有 GitOps 流水线 |
| 单 Region 部署 + K8s 多集群 | 增加复杂度无收益 | 单集群足够 |
⚠️ 常见坑:"我们用了 K8s" ≠ "我们享受了 K8s 的好处"。K8s 是一套"约定大于配置"的系统——如果你的应用没有按 12-factor 改造(健康检查、配置外置、优雅停机、日志结构化),上 K8s 只会增加故障面。没有改造好就跑 K8s = 把混乱的东西放到更复杂的环境里。
💡 关键直觉:部署形态的选择不是"先进 vs 落后",而是"复杂度匹配业务规模"。一个 QPS 100 的内部工具用 K8s 是浪费,一个 QPS 10 万的电商用虚机是瓶颈。判断标准是"你的运维能力能否驾驭这个复杂度"。
下一节我们切到"存储"——对象 / 块 / 文件三种存储模型的不可替代性。