第 9 章

ECS 容器服务实战

⏱️ 50 分钟
📝 20 题练习
备考助手

📌 核心知识点

ECS vs EKSFargate 使用场景服务发现蓝绿部署

ECS 容器服务实战

📖 ECS 基础知识

ECS (Elastic Container Service) 是 AWS 的容器编排服务,于 2014 年底发布。它管理通过 Docker 部署的服务集群,是 AWS 原生的容器解决方案。

📒 官方文档开发者指南FAQ定价

🖼️ ECS 图解补充

ALB 组件架构(AWS 官方)

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

EC2 实例生命周期(AWS 官方)

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

IAM Permission Boundary 作用范围(AWS 官方)

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

成本分配报表示例(AWS 官方)

看图重点:容器平台成本建议按集群/服务/环境打标签并做月度归因。

发展历史

2014年底: ECS 发布
2017年: Fargate 发布
2018年6月: EKS (托管 Kubernetes) 发布

容器运行方式

在 AWS 上运行 Docker 有多种方式:

  1. ECS - AWS 原生容器编排
  2. EKS - 托管 Kubernetes
  3. 直接在 EC2 上运行 Docker - 自己管理一切
  4. 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 分层架构(AWS 官方)

看图重点:从集群、服务、任务到容器的层级关系是 ECS 问题排查与扩容设计的基础。

ECR (容器镜像仓库)

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 优势

📒 EKS 官方文档用户指南FAQ定价

✓ 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 任务存储是临时的!
# 任务停止后,存储会被删除

ECS 公网出站模式(AWS 官方)

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

ECS 私网出站模式(AWS 官方)

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

ECS 通过 NAT Gateway 访问外部服务(AWS 官方)

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

ECS 通过 VPC Endpoint 访问 AWS 服务(AWS 官方)

看图重点:访问 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 陷阱

  1. 任务角色 vs 执行角色: 混淆两者权限

    # 任务角色 (Task Role): 容器内应用访问 AWS 服务的权限
    # 执行角色 (Execution Role): ECS Agent 拉取镜像、写日志的权限
    
  2. 健康检查启动时间: startPeriod 设置太短

  3. 日志未配置: 无法调试问题

  4. 网络模式选错: 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 CloudGKE托管 Kubernetes
AzureAKS, ACIK8s + 无服务器容器
HashiCorpNomad与 Consul, Vault 深度集成
开源Kubernetes可部署在任何云或本地

📚 本章小结

  • ECS 是 AWS 原生容器编排服务,2014 年底发布
  • EKS 是托管 Kubernetes,2018 年 6 月发布
  • Fargate 简化运维,但成本可能是 EC2 的数倍
  • ECR 不支持跨区域复制和自定义域名
  • 使用 ALB 可避免端口冲突,支持动态端口映射
  • fluentd 等日志驱动需要在 ecs.config 中启用
  • Fargate 存储是临时的,任务停止后数据丢失
  • EKS 需要注意 IP 耗尽和缺少内置 CloudWatch 监控
  • 服务发现和蓝绿部署是生产必备
  • 合理配置资源限制和自动扩缩容
📝 章节练习 (20 题)
开始练习