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 提供了从简单到复杂的完整容器解决方案!