206 lines
6.4 KiB
Markdown
206 lines
6.4 KiB
Markdown
# 第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——持续集成与持续部署。了解如何自动化你的代码从提交到上线的整个流程,让部署变得安全、快速、可重复。
|