AWS 容器服务
AWS 提供多种容器运行方式,从完全托管到自主控制,满足不同需求。
容器服务对比
服务概览
┌─────────────────────────────────────────────────┐
│ 容器编排层 │
├──────────────┬──────────────┬──────────────────┤
│ ECS │ EKS │ App Runner │
│ AWS 原生 │ Kubernetes │ 全托管 PaaS │
│ 简单易用 │ 开源标准 │ 零配置 │
└──────────────┴──────────────┴──────────────────┘
│
┌───────────┴───────────┐
│ │
┌─────▼─────┐ ┌──────▼──────┐
│ EC2 │ │ Fargate │
│ 自管实例 │ │ 无服务器 │
│ 完全控制 │ │ 零运维 │
└───────────┘ └─────────────┘
特性对比
| 特性 | ECS on EC2 | ECS on Fargate | EKS on EC2 | EKS on Fargate |
|---|---|---|---|---|
| 控制力 | 完全控制 | 中等 | 完全控制 | 中等 |
| 管理负担 | 高 | 低 | 高 | 低 |
| 成本 | 最低 | 中等 | 中等 | 较高 |
| 启动速度 | 分钟级 | 秒级 | 分钟级 | 秒级 |
| 生态系统 | AWS 原生 | AWS 原生 | Kubernetes | Kubernetes |
| 学习曲线 | 简单 | 简单 | 陡峭 | 中等 |
ECS(Elastic Container Service)
核心概念
任务定义(Task Definition):
- 类似 Docker Compose 文件
- 定义容器配置、资源需求
- 版本化管理
服务(Service):
- 维护指定数量的任务
- 集成负载均衡器
- 支持滚动更新
集群(Cluster):
- 资源池(EC2 或 Fargate)
- 逻辑分组单位
ECS 架构
┌────────────────────────────────────────┐
│ Application Load Balancer │
└────────────┬───────────────────────────┘
│
┌─────────┴─────────┐
│ │
┌──▼────────┐ ┌──────▼───┐
│ ECS │ │ ECS │
│ Service │ │ Service │
│ (Web) │ │ (API) │
└──┬────────┘ └──────┬───┘
│ │
├─ Task 1 ├─ Task 1
├─ Task 2 └─ Task 2
└─ Task 3
│
┌────▼─────────────────┐
│ ECS Cluster │
│ ┌────────┬────────┐ │
│ │ EC2 │ EC2 │ │
│ │ Instance│Instance│ │
│ └────────┴────────┘ │
└──────────────────────┘
何时选择 ECS
✅ 适合场景:
- AWS 生态深度集成
- 简单的容器编排需求
- 快速上手,无 K8s 经验
- 成本敏感项目
ECS 优势:
- 与 AWS 服务原生集成(IAM、CloudWatch、ALB)
- 无需管理控制平面(免费)
- 简单的任务定义和服务配置
- 支持 Spot 实例降低成本
ECS 劣势:
- AWS 专属,不可迁移到其他云
- 功能相对 Kubernetes 有限
- 生态和工具相对较少
EKS(Elastic Kubernetes Service)
核心概念
托管控制平面:
- AWS 管理 Master 节点
- 高可用、自动升级
- 符合 Kubernetes 标准
节点组(Node Group):
- EC2 实例的集合
- 自动扩展支持
- 支持 Spot 实例
Fargate Profile:
- 无服务器节点
- 按 Pod 计费
- 零节点管理
EKS 架构
┌────────────────────────────────────────┐
│ Kubernetes API Server │
│ (AWS 托管控制平面) │
└────────────┬───────────────────────────┘
│
┌─────────┴─────────┐
│ │
┌──▼──────────┐ ┌─────▼────────┐
│ Node Group │ │ Fargate │
│ (EC2) │ │ Profile │
└─┬───────────┘ └──┬───────────┘
│ │
├─ Worker Node 1 ├─ Pod 1 (无节点)
│ ├─ Pod 1 └─ Pod 2 (无节点)
│ └─ Pod 2
│
└─ Worker Node 2
├─ Pod 3
└─ Pod 4
何时选择 EKS
✅ 适合场景:
- 已有 Kubernetes 经验
- 需要复杂的编排能力
- 多云或混合云策略
- 丰富的生态工具需求
EKS 优势:
- 标准 Kubernetes,可移植
- 强大的编排能力
- 丰富的第三方工具支持
- 活跃的社区
EKS 劣势:
- 学习曲线陡峭
- 控制平面收费($0.10/小时)
- 管理复杂度高
- 需要 Kubernetes 专业知识
Fargate(无服务器容器)
核心理念
完全托管:
- 无需管理 EC2 实例
- 无需配置集群大小
- 自动扩展
按需付费:
- 按 vCPU 和内存计费
- 按秒计费
- 无空闲成本
Fargate 工作原理
容器镜像
│
▼
任务定义/Pod 规范
│
├─ CPU: 0.25 vCPU
├─ 内存: 512 MB
└─ 网络: awsvpc
│
▼
Fargate 调度器
│
├─ 分配专用微虚拟机
├─ 拉取容器镜像
└─ 启动容器
│
▼
运行中的任务
│
└─ 任务结束 → 自动回收资源
Fargate 定价
vCPU:
- $0.04048 / vCPU / 小时
内存:
- $0.004445 / GB / 小时
示例计算:
配置:0.5 vCPU, 1 GB 内存
运行时间:24 小时
成本 = (0.5 × $0.04048 + 1 × $0.004445) × 24
= ($0.02024 + $0.004445) × 24
≈ $0.59 / 天
何时选择 Fargate
✅ 适合场景:
- 不想管理服务器
- 间歇性工作负载
- 快速原型开发
- 批处理任务
❌ 不适合场景:
- 需要 GPU 加速
- 需要持久化本地存储
- 对成本极度敏感(大规模运行)
- 需要特殊的实例类型
容器镜像管理
ECR(Elastic Container Registry)
特性:
- 完全托管的 Docker 镜像仓库
- 与 IAM 集成的访问控制
- 镜像扫描(漏洞检测)
- 跨区域复制
- 生命周期策略
镜像扫描:
推送镜像
│
▼
ECR 自动扫描
│
├─ 检测 CVE 漏洞
├─ 评估严重程度
└─ 生成报告
│
▼
集成 Security Hub
│
└─ 告警和自动化响应
生命周期策略:
- 自动清理旧镜像
- 保留最近 N 个版本
- 按标签或年龄清理
服务网格与可观测性
AWS App Mesh
功能:
- 服务间通信管理
- 流量控制和路由
- 可观测性增强
- 跨服务重试和超时
架构:
┌──────────────────────────────────┐
│ App Mesh 控制平面 │
└────────────┬─────────────────────┘
│
┌─────────┴─────────┐
│ │
┌──▼─────────┐ ┌─────▼────────┐
│ Service A │ │ Service B │
│ + Envoy │───│ + Envoy │
└────────────┘ └──────────────┘
Container Insights
监控指标:
- CPU、内存、网络使用率
- 容器重启次数
- 任务/Pod 状态
- 日志聚合
集成:
- CloudWatch Logs
- CloudWatch Metrics
- X-Ray 追踪
最佳实践
1. 镜像优化
减小镜像大小:
- 使用 Alpine/Distroless 基础镜像
- 多阶段构建
- 只安装必要的依赖
- 清理构建缓存
安全加固:
- 定期扫描漏洞
- 使用非 root 用户运行
- 最小化攻击面
- 镜像签名验证
2. 资源配置
合理设置资源请求:
- CPU 和内存不要设置过大(浪费)
- 也不要过小(OOM 崩溃)
- 基于实际使用情况调整
- 使用 Horizontal Pod Autoscaler
健康检查:
- 配置 liveness probe(存活探针)
- 配置 readiness probe(就绪探针)
- 合理设置超时和重试
3. 网络配置
VPC 模式:
- ECS/EKS 任务获得独立 ENI
- 支持安全组控制
- 可分配弹性 IP
服务发现:
- Cloud Map 自动服务注册
- DNS 自动解析
- 健康检查集成
4. CI/CD 集成
部署流程:
代码提交
│
▼
构建镜像(CodeBuild)
│
▼
推送到 ECR
│
▼
更新任务定义
│
▼
滚动更新(CodeDeploy)
│
├─ Blue/Green 部署
├─ 金丝雀发布
└─ 自动回滚
故障排查
常见问题
容器无法启动:
- 检查镜像是否存在
- 验证 IAM 权限
- 查看容器日志
- 检查资源限制
网络连接问题:
- 验证安全组规则
- 检查路由表配置
- 确认 DNS 解析
- 测试服务连通性
性能问题:
- 查看资源使用率
- 分析慢日志
- 使用 X-Ray 追踪
- 优化数据库查询
容器化是现代应用的标准实践,AWS 提供了从简单到复杂的完整容器解决方案!