“容器已经启动了,但该如何管理它们呢?”
— 首次使用AWS的开发者都会遇到的困惑
🎯 本文涵盖内容
- ECS与EKS的核心概念和架构差异
- 各服务的优缺点和成本结构
- 实际基础设施配置示例代码 (任务定义, Helm Chart)
- 根据团队规模和工作负载选择标准
- 迁移时需要考虑的陷阱
📌 引言 / 背景
随着容器技术的普及,“如何稳定运行多个容器”的问题应运而生。在单个服务器上只安装Docker只适用于开发环境;在实际生产中,需要编排 (Orchestration) — 即自动处理容器部署、扩展和故障恢复的工具。
在AWS中,主要由两个服务承担这一角色:
- 🟠 Amazon ECS (Elastic Container Service): AWS自主开发的容器编排器
- 🔵 Amazon EKS (Elastic Kubernetes Service): AWS提供的托管式开源Kubernetes服务
这两个服务都旨在“在集群上运行容器”,但它们的理念和操作方式完全不同。本文将深入探讨这些差异。

🔍 什么是ECS? — AWS的自有解决方案
核心结构
ECS是AWS独立开发的容器平台。它设计为无需了解Kubernetes即可使用,并且大部分操作可以通过AWS控制台完成。
ECS的核心组件如下:
| 组件 | 说明 |
| 任务定义 (Task Definition) | 容器执行规范。定义镜像、CPU/内存、环境变量等 |
| 任务 (Task) | 基于任务定义实际运行的容器实例 |
| 服务 (Service) | 保持一定数量的任务,负责自动恢复/扩展 |
| 集群 (Cluster) | 任务和服务运行的逻辑隔离单元 |
两种执行模式
ECS根据容器的运行位置支持两种模式。
1️⃣ EC2模式: 直接预置EC2实例并在其上运行容器。用户负责节点管理。
2️⃣ Fargate模式: 无服务器。无需预置EC2,AWS会根据您的定义自动运行容器。这是最符合ECS理念的使用方式。
ECS任务定义示例
{
"family": "web-app",
"networkMode": "awsvpc",
"requiresCompatibilities": ["FARGATE"],
"cpu": "512",
"memory": "1024",
"containerDefinitions": [
{
"name": "web",
"image": "123456789.dkr.ecr.ap-northeast-2.amazonaws.com/web:latest",
"portMappings": [
{
"containerPort": 80,
"protocol": "tcp"
}
],
"environment": [
{
"name": "APP_ENV",
"value": "production"
}
],
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "/ecs/web-app",
"awslogs-region": "ap-northeast-2",
"awslogs-stream-prefix": "ecs"
}
}
}
]
}
💡 使用awsvpc网络模式时,每个任务都会被分配一个ENI (弹性网络接口),并在VPC内拥有独立的IP。安全组可以应用于任务级别,这在安全性方面具有优势。
🔍 什么是EKS? — AWS上的Kubernetes
Kubernetes为何如此流行?
Kubernetes (K8s) 是一个受Google内部系统Borg启发而创建的开源编排器。自2014年开源以来,它现在由CNCF (云原生计算基金会) 管理,并已成为云原生领域的实际标准。
EKS是AWS提供的托管式Kubernetes服务。控制平面 (主节点) 由AWS管理,而工作节点 (EC2或Fargate) 由用户操作。
EKS核心组件
| K8s资源 | 作用 |
| Pod | 容器的最小执行单元 (一个或多个容器的集合) |
| Deployment | Pod的声明式部署和更新管理 |
| Service | 为Pod提供稳定的网络端点 |
| Namespace | 集群内的逻辑隔离单元 |
| ConfigMap / Secret | 分离管理配置值和敏感信息 |
| HPA | 根据负载自动水平扩展Pod |
EKS部署示例
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
namespace: production
spec:
replicas: 3 # 保持3个Pod
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web
image: 123456789.dkr.ecr.ap-northeast-2.amazonaws.com/web:latest
ports:
- containerPort: 80
resources:
requests:
cpu: "250m" # 0.25 vCPU
memory: "256Mi"
limits:
cpu: "500m"
memory: "512Mi"
env:
- name: APP_ENV
value: "production"
---
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: web-service
namespace: production
spec:
selector:
app: web
ports:
- port: 80
targetPort: 80
type: ClusterIP
HPA (水平Pod自动扩缩) 配置
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: web-hpa
namespace: production
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: web-app
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70 # 当CPU超过70%时进行扩容
⚖️ ECS vs EKS 核心比较
| 项目 | ECS | EKS |
| 学习难度 | ⭐⭐ (低) | ⭐⭐⭐⭐ (高) |
| AWS依赖性 | 强 (AWS专用) | 低 (支持多云) |
| 控制平面费用 | 免费 | 约 $0.10/小时 (约 $72/月) |
| 生态系统 | 以AWS服务为中心 | CNCF开源生态系统 |
| 定制化 | 有限 | 非常灵活 |
| 运维复杂性 | 低 | 高 |
| Fargate支持 | 完全支持 | 有限支持 |
| 多云 | ❌ | ✅ |
| 服务网格 | App Mesh集成 | 自由选择Istio, Linkerd等 |
| RBAC | 基于IAM (简单) | K8s RBAC + IAM (精细) |
—
💡 如何选择? — 实际选择标准
ECS适用情况 ✅
- 主要使用AWS生态系统的团队: 与ELB、CloudWatch、IAM自然集成。
- 小型团队或初创公司: 没有专门的Kubernetes运维人员时。
- 快速上市是首要任务: 希望无需学习曲线即可立即部署容器时。
- 面向无服务器架构: 希望通过与Fargate结合来最小化基础设施管理时。
- 仅在AWS上运行: 没有计划迁移到其他云时。
EKS适用情况 ✅
- 多云或混合策略: 希望以与GKE、AKS相同的方式进行操作时。
- 复杂的微服务: 需要精细管理数十到数百个服务时。
- 拥有专门的DevOps/SRE团队: 拥有专业的Kubernetes运维人员时。
- 利用开源生态系统: 积极利用Istio、ArgoCD、Prometheus、Grafana等时。
- 精细的资源管理: 需要精确调整Pod级别的CPU/内存请求和限制时。
💰 理解成本结构
ECS成本
ECS自身的控制平面是免费的。成本产生于您运行的基础设施。
- EC2模式: 使用的EC2实例费用
- Fargate模式: 根据vCPU和内存使用量按秒计费
Fargate 요금 예시 (서울 리전 기준):
- vCPU: $0.04048 / vCPU-hour
- Memory: $0.004445 / GB-hour
0.5 vCPU + 1GB 메모리 Task를 한 달 실행 시:
약 $0.04048 × 0.5 × 720 + $0.004445 × 1 × 720
= $14.57 + $3.20 ≈ 월 $17.77
EKS成本
EKS会产生单独的控制平面费用。
EKS 클러스터 기본 요금:
- Control Plane: $0.10/시간 = 약 월 $72
+ 워커 노드(EC2 또는 Fargate) 비용
+ 로드밸런서, NAT Gateway 등 부가 인프라 비용
⚠️ 对于小型服务,EKS的控制平面费用 (每月$72) 可能会成为负担。然而,对于大型服务,这笔费用仅占总基础设施成本的极小一部分。
💻 实际部署流程比较
ECS + Fargate部署 (AWS CLI)
# 1. 将镜像推送到ECR
aws ecr get-login-password --region ap-northeast-2 |
docker login --username AWS --password-stdin
123456789.dkr.ecr.ap-northeast-2.amazonaws.com
docker build -t web-app .
docker tag web-app:latest 123456789.dkr.ecr.ap-northeast-2.amazonaws.com/web-app:latest
docker push 123456789.dkr.ecr.ap-northeast-2.amazonaws.com/web-app:latest
# 2. 注册任务定义
aws ecs register-task-definition
--cli-input-json file://task-definition.json
# 3. 创建服务 (Fargate)
aws ecs create-service
--cluster my-cluster
--service-name web-service
--task-definition web-app:1
--desired-count 2
--launch-type FARGATE
--network-configuration "awsvpcConfiguration={subnets=[subnet-xxx],securityGroups=[sg-xxx],assignPublicIp=ENABLED}"
EKS部署 (kubectl)
# 1. 配置kubeconfig
aws eks update-kubeconfig
--region ap-northeast-2
--name my-eks-cluster
# 2. 推送ECR镜像 (与ECS相同)
# 3. 部署K8s资源
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
# 4. 检查部署状态
kubectl rollout status deployment/web-app -n production
# 5. 检查Pod列表
kubectl get pods -n production -o wide
⚠️ 注意事项 / 常见错误
ECS常见错误
1. 混淆任务角色 (Task Role) 和执行角色 (Execution Role) 🚨
Task Execution Role: ECS가 ECR에서 이미지를 pull하고 CloudWatch에 로그를 쓰는 권한
Task Role: 컨테이너 내 애플리케이션이 AWS API를 호출하는 권한
둘 다 필요하지만 목적이 다릅니다!
2. 未配置Fargate的EFS挂载: 在Fargate上部署有状态 (Stateful) 应用程序时,如果没有持久存储,数据将会丢失。
3. 未配置服务发现 (Service Discovery): 在微服务通信中,如果使用硬编码的IP,当任务重启时连接会中断。请使用AWS Cloud Map或Service Connect。
EKS常见错误1. 未设置资源请求/限制 (Resource Requests/Limits) 🚨
# ❌ 这样会导致节点资源被无限制使用
containers:
- name: web
image: my-app:latest
# ✅ 必须明确指定
containers:
- name: web
image: my-app:latest
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "500m"
memory: "512Mi"
2. 未应用IRSA (IAM Roles for Service Accounts): 当Pod使用AWS服务时,直接使用节点的IAM角色会违反最小权限原则。请使用IRSA为每个Pod授予独立权限。
3. 未配置etcd加密: Secret资源默认以Base64编码 (非加密!) 存储在etcd中。创建EKS集群时必须启用Envelope Encryption。
✅ 总结 / 结束语
ECS与EKS,最终不是“哪个更好”的问题,而是“哪个更适合我们的团队”的问题。
| 情况 | 推荐 |
| 完全使用AWS、小型团队、快速上市 | ECS + Fargate |
| 多云、大规模微服务 | EKS |
| 学习Kubernetes目的 | EKS (与实际技能相关联) |
| 最小化运维负担 | ECS + Fargate |
实际场景中,两种服务混合使用的情况也很常见。例如,简单的批处理任务在ECS上运行,而复杂的微服务集群则在EKS上运行。
下一步,建议您学习使用Terraform自动化EKS集群、使用ArgoCD进行GitOps部署以及通过Karpenter实现节点自动扩缩。🚀
发表回复