AWS容器化实战:使用ECS和EKS部署微服务的完整流程
将应用容器化并部署到容器编排平台,是云原生架构的核心实践。AWS提供了两套主流的容器服务:Amazon ECS(Elastic Container Service)和Amazon EKS(Elastic Kubernetes Service)。ECS是AWS原生的容器编排服务,深度集成AWS生态;EKS则是托管的Kubernetes,提供与开源社区完全一致的体验。本文将分别介绍两种服务的实践路径,并给出选择建议。
一、从应用打包开始:Docker镜像构建
1.1 编写Dockerfile
无论选择ECS还是EKS,第一步都是将应用打包成Docker镜像。一个典型的Dockerfile包含以下阶段:
dockerfile
复制下载
# 多阶段构建示例FROM node:18-alpine AS builderWORKDIR /appCOPY package*.json ./RUN npm ciCOPY . .RUN npm run buildFROM node:18-alpineWORKDIR /appCOPY --from=builder /app/dist ./distCOPY --from=builder /app/node_modules ./node_modulesEXPOSE 3000CMD ["node", "dist/index.js"]
1.2 镜像存储与扫描
构建好的镜像需要推送到镜像仓库。AWS提供了Amazon ECR作为托管镜像仓库。推送到ECR后,可以启用镜像扫描功能,自动检测已知漏洞。
推送命令示例:
bash
复制下载
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.us-east-1.amazonaws.comdocker tag my-app:latest 123456789012.dkr.ecr.us-east-1.amazonaws.com/my-app:latestdocker push 123456789012.dkr.ecr.us-east-1.amazonaws.com/my-app:latest
二、选择ECS还是EKS?
2.1 ECS:深度集成AWS,学习曲线平缓
ECS是AWS原生的容器编排服务,与IAM、CloudWatch、Load Balancer等AWS服务无缝集成。ECS有两种运行模式:
EC2模式:用户管理EC2实例,由ECS调度容器到这些实例上。适合需要精确控制基础设施的场景。
Fargate模式:无服务器模式,用户只需定义任务定义,AWS负责底层计算资源。适合不想管理服务器的场景。
ECS的优势在于简单易用,无需学习Kubernetes的复杂概念,且与AWS生态集成最佳。对于已经在使用AWS服务、团队规模较小的场景,ECS是理想选择。
2.2 EKS:Kubernetes标准,可移植性强
EKS是托管的Kubernetes服务,兼容上游K8s API。这意味着你可以使用相同的工具链(kubectl、Helm、Kustomize)管理本地和云上环境。
EKS的优势在于可移植性。如果希望避免供应商锁定,或需要与本地K8s环境保持一致,EKS是更好的选择。此外,Kubernetes生态中有大量开源工具可以无缝使用。
2.3 决策参考
考虑因素 | 推荐ECS | 推荐EKS |
团队经验 | 熟悉AWS | 熟悉Kubernetes |
应用类型 | 传统企业应用 | 云原生微服务 |
可移植性要求 | 低,锁定AWS可接受 | 高,需要多云或混合云 |
运维复杂度 | 较低 | 较高 |
三、ECS实战:部署一个Web应用
3.1 定义任务定义
任务定义是ECS的核心概念,类似于Kubernetes的Pod定义。下面是一个示例任务定义:
json
复制下载
{ "family": "web-app", "networkMode": "awsvpc", "executionRoleArn": "arn:aws:iam::123456789012:role/ecsTaskExecutionRole", "containerDefinitions": [ { "name": "web", "image": "123456789012.dkr.ecr.us-east-1.amazonaws.com/web-app:latest", "portMappings": [ { "containerPort": 80, "protocol": "tcp" } ], "environment": [ { "name": "DATABASE_URL", "value": "postgres://..." } ], "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group": "/ecs/web-app", "awslogs-region": "us-east-1", "awslogs-stream-prefix": "web" } } } ]}
3.2 创建服务
服务负责维持任务副本数量,并与负载均衡器集成。创建服务时可以指定:
期望任务数量
部署策略:滚动更新、蓝绿部署
负载均衡器配置
自动扩缩策略
3.3 配置负载均衡器
使用Application Load Balancer将流量分发到容器。创建目标组,将服务关联到目标组,ALB会自动将健康的任务注册到目标组中。
3.4 自动扩缩
基于CPU利用率或请求数配置自动扩缩策略:
目标追踪扩缩:保持CPU利用率在70%左右
步进扩缩:根据不同阈值增减任务数量
四、EKS实战:部署同样的应用
4.1 创建EKS集群
使用eksctl命令行工具可以快速创建集群:
bash
复制下载
eksctl create cluster --name my-cluster --region us-east-1 --fargate
Fargate模式可以完全免去节点管理。
4.2 编写Kubernetes清单
部署文件包括Deployment和Service:
yaml
复制下载
apiVersion: apps/v1kind: Deploymentmetadata: name: web-appspec: replicas: 3 selector: matchLabels: app: web-app template: metadata: labels: app: web-app spec: containers: - name: web image: 123456789012.dkr.ecr.us-east-1.amazonaws.com/web-app:latest ports: - containerPort: 80 env: - name: DATABASE_URL value: "postgres://..."---apiVersion: v1kind: Servicemetadata: name: web-appspec: selector: app: web-app ports: - port: 80 targetPort: 80 type: LoadBalancer
4.3 部署应用
使用kubectl命令部署:
bash
复制下载
kubectl apply -f deployment.yaml
EKS会自动创建AWS负载均衡器,并将流量分发到后端Pod。
五、CI/CD集成
无论是ECS还是EKS,都可以通过CodePipeline、CodeBuild实现CI/CD。典型流程:
代码提交到CodeCommit或GitHub
CodeBuild拉取代码,运行测试,构建镜像
推送镜像到ECR
触发部署(ECS更新服务,或EKS执行kubectl set image)
六、监控与日志
6.1 ECS监控
ECS与CloudWatch原生集成,可以在控制台查看CPU、内存等指标。使用CloudWatch Logs收集容器日志,配置日志组和保留策略。
6.2 EKS监控
EKS推荐使用Prometheus + Grafana进行监控。可以通过部署Prometheus Operator采集指标,利用CloudWatch Container Insights获得集群级别的监控数据。
七、结语
容器化是迈向云原生的必经之路。无论选择ECS还是EKS,都能帮助你实现应用的标准化部署、弹性伸缩和简化运维。ECS适合追求简单、深度集成AWS的场景;EKS适合需要Kubernetes生态、追求可移植性的场景。选择哪个,取决于你的团队技术栈和业务需求。重要的是迈出第一步——把第一个应用容器化,你就能体会到容器带来的便捷。
如果需要更深入咨询了解可以联系全球代理上TG:@jinniuge 他们在云平台领域有更专业的知识和建议,他们有国际阿里云,国际腾讯云,国际华为云,aws亚马逊,谷歌云一级代理的渠道,客服1V1服务,支持免实名、免备案、免绑卡。开通即享专属VIP优惠、充值秒到账、官网下单享双重售后支持。不懂找他们就对了。
3 .0
