【问题标题】:How to change express.js microservice application for ecs auto scaling如何更改 express.js 微服务应用程序以实现 ecs 自动缩放
【发布时间】:2017-08-03 20:04:28
【问题描述】:
这是我的容器化微服务应用程序和工作流程。
-
Travis 从 git 拉取代码,构建 docker 镜像并推送到 ECR。
- 在成功构建 travis 时使用 aws cli 使用新图像标签更新 ECS 任务和服务。
- 每个开发和暂存集群都有一个实例。
- 我可以为 prod 集群拥有多个实例,但每个 dev 和 staging 集群不超过 1 个实例。
- 解决方案大概有10个微服务,rabbitmq和mysql。 (网关、API 等)
场景:
如果我的 webapp 或任何其他容器被高度使用,我想通过在同一个 ec2 实例中自动创建多个容器来扩展它。 (实例有足够的内存和内存)。
目前我将 webapp 的端口硬编码为 3000。我的 express.js 代码应如何更改以下内容?
- 为 webapp 和 api 动态绑定端口。
- 在它们内部进行负载平衡。
- 配置自动缩放以使其自动发生。
另外:
这可以使用 Ansible 实现吗?如何?
我需要扩展容器,而不是集群或实例。
【问题讨论】:
标签:
amazon-web-services
express
docker
microservices
amazon-ecs
【解决方案1】:
为 webapp 和 api 动态绑定端口。
在它们内部进行负载平衡。
NodeJS/Express 应用程序只是绑定到容器的静态端口。在您的任务定义中,您只需指定容器端口,这样主机端口将被随机分配。此时您必须使用负载均衡器,因为有多个容器正在运行。如果您使用 Application Load Balancer,您可以设置 ECS,使目标组自动获取注册和注销的新端口。详情请查看the docs。
在简历中:不要更改您的 express.js 代码。
配置自动缩放以使其自动发生。
您现在可以在 ECS 中配置服务时设置“服务自动扩展”。这可以响应 Cloudwatch 警报。你可以例如监控负载均衡器上与服务数量或任务内存使用量相关的请求数量。
另外:这可以使用 Ansible 实现吗?怎么样?
我建议使用脚本化基础设施工具(如 Cloudformation 或 Terraform)而不是 Ansible,因为最终您会设置某个状态,而集群/AWS 将负责扩展。您不想在运行时干预您的 AWS ECS 集群,ECS 的全部意义在于它会在您为其提供参数/策略后自行管理。
我需要扩展容器,而不是集群或实例。
不确定您为什么不想要扩展实例。如果你不扩展实例,为什么不总是运行最大数量的容器呢?如果您确实想要扩展实例,可以使用 Auto Scaling 组,也可以结合 Cloudwatch 警报。