AWS容器化实战:使用ECS和EKS部署微服务的完整流程

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