aws-doc/课程/第四阶段-应用架构/第27天-ECS容器服务.md

206 lines
6.4 KiB
Markdown
Raw Permalink Normal View History

2026-05-08 10:24:39 +08:00
# 第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——持续集成与持续部署。了解如何自动化你的代码从提交到上线的整个流程让部署变得安全、快速、可重复。