ECS 服务自动扩展与负载均衡
将 ALB 关联到 ECS 服务以实现基于路径的路由,并配置服务自动扩展以响应 CPU 或自定义 CloudWatch 指标
ECS 服务自动扩展与负载均衡 是 CoddyKit 上的免费 AWS Solutions Architect 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 AWS Solutions Architect 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 AWS Solutions Architect 课程共包含 4 节课。
ECS 服务自动扩展的必要性
ECS 服务上固定的期望数量无法应对流量波动——您要么过度配置(浪费资金),要么配置不足(性能下降)。ECS Service Auto Scaling 会根据 CloudWatch 指标自动调整任务的期望数量。它在底层使用 Application Auto Scaling 服务——与 DynamoDB、Aurora 和 ElastiCache 使用的框架相同。ECS 服务自动扩展支持目标跟踪、分步扩展和计划扩展策略。
将 ECS 注册为可扩展目标
在添加扩展策略之前,请在 Application Auto Scaling 中将 ECS 服务注册为可扩展目标。请指定最小和最大任务数、集群名称,并将服务名称用作资源 ID。这会创建自动扩展运行的边界。最小数量可确保始终具备基本容量;最大数量则可防止扩展失控,耗尽 Fargate 容量或 EC2 实例资源。
aws application-autoscaling register-scalable-target \
--service-namespace ecs \
--scalable-dimension ecs:service:DesiredCount \
--resource-id 'service/MyAppCluster/MyAppService' \
--min-capacity 2 \
--max-capacity 20ECS 服务的目标跟踪
对于大多数 ECS 服务而言,Target Tracking 是推荐的自动扩展策略。最常用的目标指标是 ECSServiceAverageCPUUtilization——将目标设置为 50% 至 70%,ECS 就会添加或移除任务,以维持该 CPU 水平。另一个强大的指标是 ALBRequestCountPerTarget:跟踪每个任务接收的 ALB 请求数,并进行扩展以维持每个实例的目标请求速率。AWS 会自动处理扩展和缩减,并设置适当的冷却时间。
aws application-autoscaling put-scaling-policy \
--service-namespace ecs \
--scalable-dimension ecs:service:DesiredCount \
--resource-id 'service/MyAppCluster/MyAppService' \
--policy-name 'ECSTargetTracking' \
--policy-type TargetTrackingScaling \
--target-tracking-scaling-policy-configuration '{
"PredefinedMetricSpecification": {
"PredefinedMetricType": "ECSServiceAverageCPUUtilization"
},
"TargetValue": 60.0,
"ScaleOutCooldown": 60,
"ScaleInCooldown": 300
}'将 ALB 路由到 ECS 服务
将应用程序负载均衡器(ALB)附加到 ECS 服务后,HTTP/HTTPS 流量会分配到所有正在运行的任务。ALB 目标组会注册每个任务的 IP(适用于 Fargate/awsvpc)或容器端口(适用于 bridge 模式)。ECS 会在新任务启动时自动将其注册到目标组,并在任务停止时取消注册。ALB 会对每个任务执行运行状况检查;对于运行状况不佳的任务,系统会先将其排空(优雅地关闭连接),然后由服务终止任务。
多个服务的基于路径的路由
一种强大的模式是使用 ALB 基于路径的路由,将不同的 URL 路径路由到不同的 ECS 服务。单个带有一个 HTTPS 侦听器的 ALB 可以将以下路径分别路由到相应服务:/api/orders/* 路由到 Orders ECS 服务,/api/users/* 路由到 Users ECS 服务,/api/products/* 路由到 Products ECS 服务——每个服务都由独立扩展的 ECS 服务提供支持。这样就不需要为每个微服务配置单独的负载均衡器,从而降低成本并简化 DNS 管理。
# ALB listener rule for ECS microservice routing
aws elbv2 create-rule \
--listener-arn 'arn:aws:elasticloadbalancing:...' \
--priority 10 \
--conditions '[{"Field": "path-pattern", "Values": ["/api/orders/*"]}]' \
--actions '[{"Type": "forward", "TargetGroupArn": "arn:...OrdersTargetGroup"}]'连接排空与取消注册延迟
当 ECS 任务即将终止(在缩减或部署期间)时,ALB 会将其标记为排空中,并停止向其路由新请求,同时允许正在处理的请求完成。取消注册延迟(默认为 300 秒,可配置范围为 0 至 3600 秒)是 ALB 在强制关闭连接前等待的时间。对于请求持续时间较短的 ECS 服务,请将取消注册延迟设置得更低(30 至 60 秒),以加快部署和缩减操作。对于长连接(WebSocket、文件上传),请保持较高的延迟。
# Set deregistration delay on target group to 60 seconds
aws elbv2 modify-target-group-attributes \
--target-group-arn 'arn:aws:elasticloadbalancing:...' \
--attributes 'Key=deregistration_delay.timeout_seconds,Value=60'ECS 扩展的自定义指标
除了 CPU 和内存之外,还可以从应用程序发布自定义 CloudWatch 指标(队列深度、活跃会话数、业务 KPI),并使用这些指标驱动扩展。例如,如果每个 ECS 任务可以同时处理 50 条队列消息,则可以将 SQS 队列深度发布为自定义指标,并创建以每个任务 50 条消息为目标的目标跟踪策略。这样,扩展就直接由业务逻辑驱动,而不是依赖可能无法反映应用程序负载的基础设施指标。
aws application-autoscaling put-scaling-policy \
--policy-name 'QueueDepthScaling' \
--policy-type TargetTrackingScaling \
--target-tracking-scaling-policy-configuration '{
"CustomizedMetricSpecification": {
"MetricName": "QueueDepth",
"Namespace": "MyApp",
"Statistic": "Average"
},
"TargetValue": 50.0
}' \
--resource-id 'service/MyCluster/WorkerService' \
--scalable-dimension ecs:service:DesiredCount \
--service-namespace ecs任务的缩减保护
与 EC2 Auto Scaling 类似,ECS 支持任务缩减保护。正在运行的任务可以通过 ECS API 设置自己的缩减保护标志,以便在处理关键作业期间防止自己被缩减终止。这对于充当 SQS 工作进程的 ECS 任务很有用——刚刚取出一个长时间运行作业的工作进程可以保护自己,完成作业后再移除保护。如果没有此机制,缩减可能会终止正在处理作业的任务,从而导致作业重复或数据丢失。
# From inside the ECS task container
curl -X PUT 'http://169.254.170.2/v3/tasks/scale-in-protection' \
-H 'Content-Type: application/json' \
-d '{"ProtectionEnabled": true, "ExpiresInMinutes": 60}'扩展指标:CPU、内存与 ALB
请谨慎选择扩展指标。CPU 利用率是默认指标,适用于受计算能力限制的工作负载。内存利用率(ECSServiceAverageMemoryUtilization)适用于受内存限制的应用程序,但增加内存需要添加任务——如果任务受限于每个任务的内存,而不是并发处理能力,那么修改任务定义中的内存分配可能更合适。ALBRequestCountPerTarget与用户体验直接相关,是 Web API 最具可操作性的指标——应根据每个任务的实际请求速率进行扩展。
ECS 部署熔断器
ECS Deployment Circuit Breaker 会自动检测失败的部署,并回滚到上一个稳定版本。如果没有该机制,错误的部署(无法通过运行状况检查的容器)会导致 ECS 无限期地持续尝试启动新任务。启用熔断器后,如果在检测时间窗口内,新启动任务中有一定比例未通过运行状况检查,ECS 会将部署标记为 FAILED,并自动回滚到上一个任务定义修订版本。这可以防止错误部署造成长时间的服务性能下降。
aws ecs create-service \
--cluster 'MyAppCluster' \
--service-name 'MyAppService' \
--task-definition 'myapp-task:5' \
--desired-count 3 \
--deployment-configuration '{
"deploymentCircuitBreaker": {
"enable": true,
"rollback": true
},
"minimumHealthyPercent": 100,
"maximumPercent": 200
}'端到端架构:ECS + ALB + 自动扩展
一种适用于生产环境的容器化 Web API 架构如下:Route 53 将域名解析到 ALB 的 DNS 名称;ALB 终止 HTTPS(ACM 证书)、应用 WAF 规则,并将请求路由到ECS 服务目标组;位于 3 个 AZ 的私有子网中的 Fargate 任务处理请求;使用 ALBRequestCountPerTarget 进行目标跟踪的 ECS Service Auto Scaling 将任务数从 2 调整到 50;任务连接到位于私有子网中的 RDS Aurora 和 ElastiCache。所有日志都会发送到 CloudWatch Logs;指标则用于驱动 CloudWatch 控制面板和警报。
快速检查
请测试您对本课 AWS Solutions Architect(SAA-C03)概念的理解。
课程回顾
本课介绍了:ECS Service Auto Scaling 使用 Application Auto Scaling,通过目标跟踪(CPU、ALB 请求或自定义指标)在配置的最小和最大边界之间调整任务数;ALB 基于路径的路由可将 URL 路径路由到不同的目标组,使一个负载均衡器能够为多个 ECS 微服务提供服务;Deployment Circuit Breaker 会自动回滚失败的部署,避免其造成长时间的服务性能下降。至此,ECS 和容器模块已完成;接下来我们将学习 AWS 上用于 Kubernetes 的 Amazon EKS。
常见问题解答
「ECS 服务自动扩展与负载均衡」课时是免费的吗?
是的 — 「ECS 服务自动扩展与负载均衡」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 AWS Solutions Architect 课程的其余内容,请升级到 CoddyKit PRO。 AWS Solutions Architect 课程共包含 4 节课。
「ECS 服务自动扩展与负载均衡」这节课中我会学到什么?
将 ALB 关联到 ECS 服务以实现基于路径的路由,并配置服务自动扩展以响应 CPU 或自定义 CloudWatch 指标 你通过在浏览器中直接运行的动手代码来练习 AWS Solutions Architect,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 AWS Solutions Architect 需要有经验吗?
无需任何先前经验。CoddyKit 上的 AWS Solutions Architect 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「ECS 服务自动扩展与负载均衡」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 AWS Solutions Architect 课中编写并运行代码吗?
能。每节 AWS Solutions Architect 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- ECS 集群、任务定义与服务
- EC2 启动类型与 Fargate
- ECR:存储和拉取容器镜像
- ECS 服务自动扩展与负载均衡