6.4 KiB
6.4 KiB
第27天:ECS——在 AWS 上运行容器
今天你将学到什么
昨天学了容器的基础概念,今天学习如何在 AWS 上运行容器。ECS(Elastic Container Service)是 AWS 自己的容器编排服务,帮你管理容器的部署、扩展和运维。
为什么需要容器编排
一个容器很简单,一百个容器就复杂了
在自己电脑上跑一个容器很简单。但在生产环境中:
- 你可能有 50 个不同的服务,每个服务跑多个容器副本
- 某个容器挂了,需要自动重启
- 流量增加了,需要自动增加容器数量
- 新版本发布了,需要滚动更新(不停机)
- 容器之间需要互相通信
- 需要把容器合理地分配到不同的服务器上
这就是容器编排要解决的问题。
类比:如果容器是一个个工人,容器编排就是工厂的管理系统——安排谁在哪个岗位工作、有人请假了自动找人顶替、订单多了自动加人。
ECS 的核心概念
四个关键概念
| 概念 | 类比 | 说明 |
|---|---|---|
| 集群(Cluster) | 工厂 | 容器运行的环境,一组计算资源 |
| 任务定义(Task Definition) | 岗位说明书 | 描述容器怎么运行(用什么镜像、多少 CPU/内存、端口等) |
| 任务(Task) | 正在工作的工人 | 任务定义的运行实例,一个或多个容器 |
| 服务(Service) | 部门 | 确保指定数量的任务持续运行,自动替换失败的任务 |
它们之间的关系
集群(Cluster)
└── 服务(Service):"保持 3 个任务一直运行"
├── 任务 1(运行中)
├── 任务 2(运行中)
└── 任务 3(运行中)← 如果挂了,服务会自动启动新的
两种运行模式
模式一:EC2 启动类型
你自己管理运行容器的 EC2 实例。
你的 ECS 集群
├── EC2 实例 A(运行容器 1、容器 2)
├── EC2 实例 B(运行容器 3、容器 4)
└── EC2 实例 C(运行容器 5)
优点:
- 可以选择特定的实例类型(比如 GPU 实例)
- 可以使用 Spot 实例省钱
- 对底层有完全控制
缺点:
- 需要管理 EC2 实例(打补丁、监控、扩缩容)
- 需要规划容量(实例太少容器放不下,太多浪费钱)
模式二:Fargate 启动类型(推荐新手)
AWS 帮你管理底层服务器,你只需要关心容器本身。
你的 ECS 集群
├── 任务 1(Fargate 自动分配资源)
├── 任务 2(Fargate 自动分配资源)
└── 任务 3(Fargate 自动分配资源)
优点:
- 不需要管理任何服务器
- 按容器实际使用的 CPU 和内存付费
- 自动扩展,不需要规划容量
缺点:
- 单价比 EC2 稍贵
- 不支持 GPU
- 对底层没有控制权
类比:
- EC2 模式 = 自己买车。要自己加油、保养、找停车位,但完全自由。
- Fargate 模式 = 打车。不用管车的事,告诉司机去哪就行,但每公里贵一点。
任务定义详解
任务定义是一个 JSON 文件,描述容器怎么运行。关键配置项:
| 配置项 | 说明 | 举例 |
|---|---|---|
| 镜像 | 用哪个容器镜像 | 123456.dkr.ecr.region.amazonaws.com/my-app:v1.2 |
| CPU | 分配多少 CPU | 256(0.25 vCPU)、512、1024、2048、4096 |
| 内存 | 分配多少内存 | 512MB、1024MB、2048MB |
| 端口映射 | 容器暴露哪个端口 | 容器端口 8080 → 主机端口 80 |
| 环境变量 | 传给容器的配置 | DB_HOST=mydb.xxx.rds.amazonaws.com |
| 日志配置 | 日志发送到哪里 | CloudWatch Logs |
| IAM 角色 | 容器有什么 AWS 权限 | 可以读取 S3、写入 DynamoDB |
ECS 服务与负载均衡
服务的作用
ECS 服务确保你指定数量的任务始终在运行:
- 你说"保持 3 个任务运行"
- 某个任务挂了 → 服务自动启动新的,保持 3 个
- 你想扩展到 5 个 → 修改服务配置,自动启动 2 个新任务
- 发布新版本 → 服务滚动更新,逐个替换旧任务
配合 ALB 使用
用户请求 → ALB → ECS 服务(多个任务)
├── 任务 1(容器 A)
├── 任务 2(容器 A)
└── 任务 3(容器 A)
ALB 自动发现 ECS 服务中的任务,把流量均匀分配。任务增减时 ALB 自动更新。
ECS 自动扩展
ECS 支持根据负载自动调整任务数量:
| 扩展策略 | 触发条件 | 适合场景 |
|---|---|---|
| 目标追踪 | CPU 使用率保持在 70% | 通用场景 |
| 步进扩展 | CPU > 80% 加 2 个任务 | 需要精细控制 |
| 定时扩展 | 每天 9:00 扩展到 10 个任务 | 可预测的流量模式 |
实际部署流程
一个典型的 ECS 部署流程:
1. 开发者推送代码到 Git
2. CI/CD 构建新的 Docker 镜像
3. 镜像推送到 ECR
4. 更新 ECS 任务定义(指向新镜像)
5. ECS 服务执行滚动更新:
- 启动新版本的任务
- 等新任务健康检查通过
- 停止旧版本的任务
- 重复直到所有任务都是新版本
6. 用户无感知,零停机
ECS vs EKS 怎么选
| ECS | EKS | |
|---|---|---|
| 管理方 | AWS 自研 | Kubernetes(开源标准) |
| 学习曲线 | 低 | 高 |
| 灵活性 | 够用 | 非常灵活 |
| 生态系统 | AWS 生态 | Kubernetes 庞大生态 |
| 可移植性 | 锁定 AWS | 可迁移到其他云 |
| 适合 | 中小团队、AWS 深度用户 | 大团队、多云策略、已有 K8s 经验 |
建议:如果你没有 Kubernetes 经验,从 ECS + Fargate 开始。简单够用。
今天的小测验
- ECS 中"集群"、"任务定义"、"任务"、"服务"分别是什么?
- Fargate 和 EC2 启动类型的区别是什么?什么时候选哪个?
- ECS 服务如何实现零停机部署?
- 什么情况下应该选 ECS,什么情况下选 EKS?
延伸阅读
明天预告
明天学习 CI/CD——持续集成与持续部署。了解如何自动化你的代码从提交到上线的整个流程,让部署变得安全、快速、可重复。