# 第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 开始。简单够用。 --- ## 今天的小测验 1. ECS 中"集群"、"任务定义"、"任务"、"服务"分别是什么? 2. Fargate 和 EC2 启动类型的区别是什么?什么时候选哪个? 3. ECS 服务如何实现零停机部署? 4. 什么情况下应该选 ECS,什么情况下选 EKS? --- ## 延伸阅读 - [ECS 开发者指南](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/) - [Fargate 用户指南](https://docs.aws.amazon.com/AmazonECS/latest/userguide/what-is-fargate.html) - [ECS 最佳实践](https://docs.aws.amazon.com/AmazonECS/latest/bestpracticesguide/) --- ## 明天预告 明天学习 CI/CD——持续集成与持续部署。了解如何自动化你的代码从提交到上线的整个流程,让部署变得安全、快速、可重复。