📌 核心知识点
ECS 容器服务实战
📖 ECS 基础知识
ECS (Elastic Container Service) 是 AWS 的容器编排服务,于 2014 年底发布。它管理通过 Docker 部署的服务集群,是 AWS 原生的容器解决方案。
🖼️ ECS 图解补充

看图重点:ECS 服务接入 ALB 时,目标组健康检查配置决定发布稳定性。

看图重点:ECS on EC2 模式要同时关注容器和底层实例生命周期。

看图重点:Task Role 与执行角色建议加边界策略,避免权限扩散。

看图重点:容器平台成本建议按集群/服务/环境打标签并做月度归因。
发展历史
2014年底: ECS 发布
2017年: Fargate 发布
2018年6月: EKS (托管 Kubernetes) 发布
容器运行方式
在 AWS 上运行 Docker 有多种方式:
- ECS - AWS 原生容器编排
- EKS - 托管 Kubernetes
- 直接在 EC2 上运行 Docker - 自己管理一切
- Elastic Beanstalk with Docker - 如果已在使用 Beanstalk
💡 使用 Docker 可能改变服务在 EC2 或 Beanstalk 内的部署方式,但不会根本改变其他 AWS 服务的使用方式。
容器服务概览
AWS 提供多种容器运行方式:
服务对比
| 服务 | 管理复杂度 | 适用场景 |
|---|---|---|
| ECS on Fargate | 最低 | 无需管理服务器 |
| ECS on EC2 | 中等 | 需要自定义 EC2 |
| EKS | 较高 | Kubernetes 生态 |
| App Runner | 最低 | 简单 Web 应用 |
ECS 核心概念
ECS 集群 (Cluster)
├── 服务 (Service) - 长期运行的任务
│ ├── 任务定义 (Task Definition)
│ │ └── 容器定义
│ └── 期望数量: 3
│
├── 任务 (Task) - 实际运行的容器实例
│ ├── Task 1 (运行中)
│ ├── Task 2 (运行中)
│ └── Task 3 (运行中)
│
└── 容量提供者 (Capacity Provider)
├── Fargate
└── EC2 Auto Scaling

看图重点:从集群、服务、任务到容器的层级关系是 ECS 问题排查与扩容设计的基础。
ECR (容器镜像仓库)
ECR 基础
ECR (Elastic Container Registry) 是 AWS 托管的 Docker 镜像仓库服务。
# 登录 ECR
aws ecr get-login-password --region ap-southeast-2 | \
docker login --username AWS --password-stdin \
123456789012.dkr.ecr.ap-southeast-2.amazonaws.com
# 构建并推送镜像
docker build -t my-app .
docker tag my-app:latest 123456789012.dkr.ecr.ap-southeast-2.amazonaws.com/my-app:latest
docker push 123456789012.dkr.ecr.ap-southeast-2.amazonaws.com/my-app:latest
ECR 限制
# ❗ ECR 的已知限制:
# 1. 不支持跨区域复制镜像
# 如果需要快速拉取大镜像,需要推送到各区域本地仓库
# 2. 不支持自定义域名/证书
# 只能使用 AWS 提供的域名格式
与 ALB 集成
使用 ALB 时,不需要处理端口冲突问题。ALB 的目标组可以直接关联 ECS 服务:
ALB → 目标组 → ECS 服务 (动态端口映射)
│
└── 无需担心同一主机上多个服务暴露相同端口
ECS vs EKS
ECS 优势
✓ AWS 原生,深度集成
✓ 学习曲线平缓
✓ 免费 (只付计算资源)
✓ 适合 AWS 生态用户
EKS 优势
✓ Kubernetes 标准
✓ 可移植性强
✓ 丰富的生态系统
✓ 适合多云策略
EKS 技术细节:
- 提供托管的高可用 Kubernetes Master(一对)
- 认证与 IAM 集成(使用
aws eks get-token生成令牌) - 提供 Calico 网络策略支持
- 使用 kubectl 和 kubeconfig 管理
# 生成 kubeconfig
aws eks update-kubeconfig --name my-cluster --region ap-southeast-2
# 验证连接
kubectl get nodes
选择建议
| 场景 | 推荐 |
|---|---|
| 纯 AWS 环境 | ECS |
| 需要 K8s 生态 | EKS |
| 快速启动 | ECS Fargate |
| 团队有 K8s 经验 | EKS |
Fargate 使用场景
📒 Fargate 官方文档 ∙ FAQ ∙ 定价
Fargate 让你无需管理底层计算基础设施即可部署容器。它类似于 Lambda 的理念——让你专注于应用而不是服务器。
Fargate: 将容器视为基础设施的基本构建块
│
├── ECS 后端 (Launch Type)
└── EKS 后端 (Launch Type)
何时使用 Fargate
✓ 不想管理 EC2 实例
✓ 负载变化大
✓ 快速扩缩容需求
✓ 安全隔离要求高
✓ Fargate 任务可与 EC2 任务混合运行
何时使用 EC2
✓ 需要 GPU
✓ 成本优化 (Spot/Reserved)
✓ 需要访问宿主机
✓ 特殊内核配置
Fargate 定价
💸 成本警告: 在创建大规模 Fargate 部署前,务必估算成本并与传统 EC2 部署对比。Fargate 价格可能是等效 EC2 实例的数倍!
费用 = vCPU 价格 × 时间 + 内存价格 × 时间
示例 (每月):
- 0.5 vCPU, 1GB 内存
- 运行 720 小时
费用 ≈ $15-20/月 (按区域不同)
# 对比 EC2:
# t3.micro (2 vCPU, 1GB) ≈ $7/月
# Fargate 可能贵 2-3 倍
Fargate 资源限制
# 最小资源配置:
# - 0.25 vCPU
# - 0.5 GB 内存
# ❗ Fargate 任务存储是临时的!
# 任务停止后,存储会被删除

看图重点:公网子网部署简单,但要严格控制安全组与暴露面。

看图重点:私网部署更安全,出站通常通过 NAT 或 VPC Endpoint。

看图重点:NAT Gateway 方案易用但有额外数据处理费,大流量场景要做成本评估。

看图重点:访问 S3/ECR/CloudWatch 等 AWS 服务时,VPC Endpoint 能提升安全性并减少公网路径依赖。
服务发现
Cloud Map 集成
ECS 服务 A ──→ serviceA.local ──→ ECS 服务 B
│
AWS Cloud Map
(服务发现)
配置示例
{
"serviceName": "my-service",
"serviceDiscovery": {
"registryArn": "arn:aws:servicediscovery:...",
"containerName": "web",
"containerPort": 80
}
}
DNS 解析
# 服务间调用
curl http://backend.local:8080/api
# Cloud Map 自动解析到任务 IP
蓝绿部署
CodeDeploy 蓝绿部署
ALB
│
┌─────┴─────┐
│ │
蓝色 (v1) 绿色 (v2)
(当前) (新版)
流量切换: 蓝 → 绿
部署配置
# appspec.yaml
version: 0.0
Resources:
- TargetService:
Type: AWS::ECS::Service
Properties:
TaskDefinition: "arn:aws:ecs:...:task-def/my-task:2"
LoadBalancerInfo:
ContainerName: "web"
ContainerPort: 80
PlatformVersion: "LATEST"
部署策略
| 策略 | 流量切换 | 回滚 |
|---|---|---|
| AllAtOnce | 立即切换 | 快速 |
| Linear10PercentEvery1Minutes | 渐进式 | 可中断 |
| Canary10Percent5Minutes | 金丝雀 | 安全 |
任务定义最佳实践
资源限制
{
"containerDefinitions": [
{
"name": "web",
"cpu": 256,
"memory": 512,
"memoryReservation": 256,
"portMappings": [
{
"containerPort": 80,
"protocol": "tcp"
}
]
}
],
"requiresCompatibilities": ["FARGATE"],
"cpu": "256",
"memory": "512"
}
日志配置
ECS 支持多种日志驱动:awslogs、splunk、fluentd、syslog、json 等。
{
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "/ecs/my-service",
"awslogs-region": "ap-southeast-2",
"awslogs-stream-prefix": "ecs"
}
}
}
💡 日志驱动提示:
# 使用 awslogs 发送到 CloudWatch
# 确保先创建日志组!
# ❗ fluentd 等驱动默认未启用
# 需要在 /etc/ecs/ecs.config 中配置:
ECS_AVAILABLE_LOGGING_DRIVERS='["awslogs","fluentd"]'
磁盘清理优化
# 默认设置:
# - 未使用容器 3 小时后删除
# - 未使用镜像 30 分钟后删除
# 可在 /etc/ecs/ecs.config 中优化:
ECS_ENGINE_TASK_CLEANUP_WAIT_DURATION=10m
ECS_IMAGE_CLEANUP_INTERVAL=10m
健康检查
{
"healthCheck": {
"command": ["CMD-SHELL", "curl -f http://localhost/health || exit 1"],
"interval": 30,
"timeout": 5,
"retries": 3,
"startPeriod": 60
}
}
自动扩缩容
基于 CPU/内存
aws application-autoscaling register-scalable-target \
--service-namespace ecs \
--resource-id service/my-cluster/my-service \
--scalable-dimension ecs:service:DesiredCount \
--min-capacity 2 \
--max-capacity 10
aws application-autoscaling put-scaling-policy \
--service-namespace ecs \
--resource-id service/my-cluster/my-service \
--scalable-dimension ecs:service:DesiredCount \
--policy-name cpu-scaling \
--policy-type TargetTrackingScaling \
--target-tracking-scaling-policy-configuration '{
"TargetValue": 70,
"PredefinedMetricSpecification": {
"PredefinedMetricType": "ECSServiceAverageCPUUtilization"
}
}'
💡 专家建议
使用 Fargate Spot
对于可中断的工作负载 (如批处理),Fargate Spot 可节省高达 70% 成本。
⚠️ 常见陷阱
ECS 陷阱
-
任务角色 vs 执行角色: 混淆两者权限
# 任务角色 (Task Role): 容器内应用访问 AWS 服务的权限 # 执行角色 (Execution Role): ECS Agent 拉取镜像、写日志的权限 -
健康检查启动时间: startPeriod 设置太短
-
日志未配置: 无法调试问题
-
网络模式选错: Fargate 只支持 awsvpc
EKS 陷阱
# 🔸 IP 地址耗尽
# Pod 和 Service 配置会快速消耗 VPC 内的 IP 地址
# 需要仔细规划和维护,避免 IP 耗尽
# 🔸 没有集成 CloudWatch 监控
# EKS Pod/Service 没有内置 CloudWatch 监控
# 需要部署 Prometheus 等 Kubernetes 监控系统
# 🔸 自动扩缩容局限
# 基于节点 CPU/内存 的自动扩缩有局限
# 无法感知无法调度的 Pending Pod
# 建议使用 cluster-autoscaler
# 🔸 Prometheus 是 K8s 最流行的监控方案
# 可以将指标和告警发送到 Lambda、SQS 等触发扩缩
Fargate 陷阱
# 🔸 存储是临时的
# Fargate 任务停止后,所有存储都会删除
# 需要持久化的数据必须使用 EFS 或 S3
# 🔸 最小资源限制
# 最小: 0.25 vCPU + 0.5 GB 内存
# 不能配置更小的资源
# 🔸 成本可能很高
# 相同配置可能比 EC2 贵数倍
# 大规模部署前务必做成本评估
容器替代方案
| 平台 | 服务/工具 | 说明 |
|---|---|---|
| Google Cloud | GKE | 托管 Kubernetes |
| Azure | AKS, ACI | K8s + 无服务器容器 |
| HashiCorp | Nomad | 与 Consul, Vault 深度集成 |
| 开源 | Kubernetes | 可部署在任何云或本地 |
📚 本章小结
- ECS 是 AWS 原生容器编排服务,2014 年底发布
- EKS 是托管 Kubernetes,2018 年 6 月发布
- Fargate 简化运维,但成本可能是 EC2 的数倍
- ECR 不支持跨区域复制和自定义域名
- 使用 ALB 可避免端口冲突,支持动态端口映射
- fluentd 等日志驱动需要在 ecs.config 中启用
- Fargate 存储是临时的,任务停止后数据丢失
- EKS 需要注意 IP 耗尽和缺少内置 CloudWatch 监控
- 服务发现和蓝绿部署是生产必备
- 合理配置资源限制和自动扩缩容