2. Amazon ECS核心概念与集群规划
Amazon ECS 是 AWS 原生的容器编排服务,它把“在哪里运行容器、运行什么容器、运行多少份、如何暴露和扩缩”拆成几个彼此解耦的对象。理解这些对象之间的引用关系,是后续做集群规划与启动类型选型的前提。ECS 的四个核心概念是:集群(Cluster)、任务定义(Task Definition)、服务(Service)和容量提供程序(Capacity Provider)。它们不是并列的四个名词,而是一条从“资源池”到“运行实例”的引用链。
一、四个核心对象及其职责
集群是逻辑边界,本身不承载计算资源,只是把任务和服务归拢到一个命名空间下,便于权限、监控和容量策略的划分。一个账号在同一区域可以有多个集群,例如按环境划分为 dev-cluster、prod-cluster。
任务定义是容器的“蓝图”,是一个带版本号的 JSON 模板,描述要拉取哪个镜像、分配多少 CPU 与内存、暴露哪些端口、挂载哪些卷、注入哪些环境变量、使用哪个日志驱动、以什么 IAM 角色运行。任务定义本身不运行任何东西,它只是被实例化的规格。每次修改都会生成新版本(如 web:1 → web:2),旧版本保留,便于回滚。
任务(Task)是任务定义的一次实例化,是真正被调度到计算资源上运行的最小单位。一个任务可以包含一个或多个容器,这些容器共享网络命名空间,可通过 localhost 互相通信。
服务是任务的长期管理者。它保证指定数量的任务持续运行,负责在任务失败时重新拉起、在发布新版本时按策略滚动替换、并可选地绑定负载均衡器与 Service Auto Scaling。服务引用任务定义,但不直接引用计算资源——它通过容量提供程序或启动类型来决定任务落在哪里。
容量提供程序是 EC2 启动类型下的容量抽象,它把一组 Auto Scaling 组(ASG)包装成一个可被服务引用的容量来源,并定义扩缩策略(如按 CPU 利用率目标值扩容)。Fargate 启动类型不需要容量提供程序,因为计算资源由 AWS 托管。
二、集群规划要回答的三个问题
规划集群时,不要一上来就建资源,而应先回答三个问题:隔离边界怎么划、容量从哪里来、任务如何被调度。
隔离边界:集群是权限与观测的边界。常见做法是按环境(dev/staging/prod)或按业务域划分集群。集群本身不产生费用,但跨集群的服务发现、负载均衡和 IAM 策略需要额外配置,因此不建议无意义地碎片化。一个务实的起点是:每个环境一个集群,同一环境内用命名空间(配合 Cloud Map)或服务名前缀区分业务。
容量来源:这是 EC2 与 Fargate 选型的核心。EC2 启动类型下,你需要自己维护 ASG,实例类型、AMI、启动模板、扩缩策略都由你决定;容量提供程序把 ASG 与集群关联,并支持“托管扩缩”——当任务因资源不足无法放置时,自动触发 ASG 扩容。Fargate 下没有实例概念,你只需在任务定义中声明 CPU 与内存组合(如 0.5 vCPU + 1 GB),AWS 负责找到并运行。
调度策略:EC2 下可用 binpack(尽量填满单实例,省成本)或 spread(跨 AZ 均匀分布,提可用性);Fargate 下调度由 AWS 处理,你只需关注任务放置的 AZ 均衡。
三、Fargate 与 EC2 的选型依据
选型不是“哪个更好”,而是“哪个约束更匹配”。可以从以下维度判断:
| 维度 | Fargate | EC2 |
|---|---|---|
| 运维负担 | 无实例管理,打补丁、扩缩由 AWS 负责 | 需管理 AMI、实例、ASG、补丁 |
| 计费粒度 | 按任务 vCPU/内存秒计费 | 按实例计费,空闲容量也付费 |
| 特殊硬件 | 不支持 GPU、InfiniBand | 支持 GPU、FPGA、大内存实例 |
| 启动速度 | 较快,但受镜像拉取影响 | 实例预热后可秒级放置 |
| 成本优化空间 | 可用 Fargate Spot 降本 | 可用 Reserved / Spot / Savings Plans |
| 网络模式 | 仅 awsvpc | 支持 awsvpc / bridge / host |
一个实用的判断顺序是:先看是否有 GPU、超大内存或特殊网络需求——有则必须 EC2;再看团队是否愿意承担实例运维——不愿则 Fargate;最后看成本曲线——稳定高负载且能预留实例时 EC2 更省,波动大或低频时 Fargate 更划算。很多生产系统采用混合策略:核心稳定服务跑 EC2 + 容量提供程序,突发或批处理任务跑 Fargate Spot。
base(保底容量)与 weight(权重)。例如让按需 ASG 承担 base=2 的保底任务,Spot ASG 承担剩余部分,从而在成本与稳定性之间取得平衡。
四、一个可参考的规划示例
假设要部署一个 Web API 与一个异步 Worker。Web API 流量波动大、无特殊硬件需求,选择 Fargate,任务定义 web:1 配置 0.5 vCPU / 1 GB,服务期望数 3,绑定 ALB,开启 Service Auto Scaling(目标 CPU 60%)。Worker 需要处理大内存批任务,选择 EC2,创建 c6i.2xlarge 的 ASG,包装为容量提供程序 cp-worker,服务期望数 2,调度策略用 spread 跨 AZ。这样,Web 侧无需关心实例,Worker 侧保留硬件与成本优化空间。
规划完成后,建议用 aws ecs describe-clusters 与 aws ecs list-services 核对集群内服务与容量提供程序关联是否符合预期,再进入任务定义的具体编写。