aws-doc/课程/第四阶段-应用架构/第27天-ECS容器服务.md
2026-05-08 10:24:39 +08:00

206 lines
6.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 第27天ECS——在 AWS 上运行容器
## 今天你将学到什么
昨天学了容器的基础概念,今天学习如何在 AWS 上运行容器。ECSElastic 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 集群
├── 任务 1Fargate 自动分配资源)
├── 任务 2Fargate 自动分配资源)
└── 任务 3Fargate 自动分配资源)
```
**优点**
- 不需要管理任何服务器
- 按容器实际使用的 CPU 和内存付费
- 自动扩展,不需要规划容量
**缺点**
- 单价比 EC2 稍贵
- 不支持 GPU
- 对底层没有控制权
**类比**
- EC2 模式 = 自己买车。要自己加油、保养、找停车位,但完全自由。
- Fargate 模式 = 打车。不用管车的事,告诉司机去哪就行,但每公里贵一点。
---
## 任务定义详解
任务定义是一个 JSON 文件,描述容器怎么运行。关键配置项:
| 配置项 | 说明 | 举例 |
|--------|------|------|
| 镜像 | 用哪个容器镜像 | 123456.dkr.ecr.region.amazonaws.com/my-app:v1.2 |
| CPU | 分配多少 CPU | 2560.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——持续集成与持续部署。了解如何自动化你的代码从提交到上线的整个流程让部署变得安全、快速、可重复。