如何在 AWS ECS 中扩展任务/容器
Posted
技术标签:
【中文标题】如何在 AWS ECS 中扩展任务/容器【英文标题】:How to scale tasks / containers in AWS ECS 【发布时间】:2019-02-03 04:40:22 【问题描述】:This 是 AWS 关于如何在 ECS
上部署基于微服务的应用程序的介绍性指南
显然(从文档中也可以看出),所谓的任务定义应该包含构成堆栈的所有容器。
即如果您对应的 docker-compose.yml
文件由 5 个 services
组成(在 docker compose 上下文中),那么这些都应该在 same ECS 任务定义 (?) 中结束。
据我了解,这也有助于在容器之间自动发现服务(docker-compose
和 docker swarm
中的默认行为);
问题在于 ECS 的扩展可能性是(除了EC2
实例)每个ECS
服务。
这是否意味着您不能进行容器级缩放?
如果我想要一个服务规模,我必须在我所谓的堆栈中扩展我的所有容器吗?
【问题讨论】:
【参考方案1】:嗯,ECS 只扩展任务,没有 1 个容器在任务内,如果你想在任务内扩展一个容器,你必须用所有容器扩展任务。您必须为每个服务创建一个任务。请记住,AWS 认为您只想使用简单的应用程序运行任务,该应用程序使用来自 RDS 的数据库服务以及它可以使用在 AWS 基础设施中分配的任何服务。
【讨论】:
【参考方案2】:您不需要将所有容器都放在同一个任务定义中。来自docs:
您的整个应用程序堆栈不需要存在于单个任务上 定义,在大多数情况下不应该。您的应用程序可以跨越 通过将相关容器组合到它们的多个任务定义中 自己的任务定义,每个代表一个组件。
另外,请注意,您在单个任务定义中只能使用 10 个容器定义,并且在每个任务定义中只使用一个容器定义是完全可以的。
至于扩展,您可以为每个任务定义创建一个服务。这允许堆栈中逻辑上分离的组件独立扩展。例如,如果您有 2 个服务,一个用于后端 api 服务,另一个用于前端 nginx,您可以为它们创建 2 个单独的任务定义,每个服务独立扩展。
将容器定义分组为单个任务定义的可能原因:
它们有一个逻辑目的或共享一个生命周期(一起开始和终止)。 您想将它们一起缩放。 您希望容器共享数据卷等资源。 容器需要在同一个主机实例上运行,并通过 localhost 进行通信等操作。另一方面,如果容器执行单独的逻辑功能、独立扩展、不共享生命周期或资源(如卷),则最好使用多个任务定义/服务。
还有一些关于 ECS here 的应用程序架构的文档进一步解释了这一点。
【讨论】:
我同意你描述的方法,这也是我自己通过文档得到的想法;主要问题是服务发现有点棘手(如果我理解正确,它需要创建私有托管区域)并且不像在 k8s 中那样开箱即用,如果你定义serviceA
和 serviceB
,它们无需任何进一步的配置即可相互访问;
@pkaramol 它确实需要 Route 53 中的 DNS 命名空间和托管区域。虽然不如 kubernetes 服务无缝,但使用 Route 53 自动命名 API 比以前好很多。以上是关于如何在 AWS ECS 中扩展任务/容器的主要内容,如果未能解决你的问题,请参考以下文章