如何在 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-composedocker swarm 中的默认行为);

问题在于 ECS 的扩展可能性是(除了EC2 实例)每个ECS 服务。

这是否意味着您不能进行容器级缩放?

如果我想要一个服务规模,我必须在我所谓的堆栈中扩展我的所有容器吗?

【问题讨论】:

【参考方案1】:

嗯,ECS 只扩展任务,没有 1 个容器在任务内,如果你想在任务内扩展一个容器,你必须用所有容器扩展任务。您必须为每个服务创建一个任务。请记住,AWS 认为您只想使用简单的应用程序运行任务,该应用程序使用来自 RDS 的数据库服务以及它可以使用在 AWS 基础设施中分配的任何服务。

【讨论】:

【参考方案2】:

不需要将所有容器都放在同一个任务定义中。来自docs:

您的整个应用程序堆栈不需要存在于单个任务上 定义,在大多数情况下不应该。您的应用程序可以跨越 通过将相关容器组合到它们的多个任务定义中 自己的任务定义,每个代表一个组件。

另外,请注意,您在单个任务定义中只能使用 10 个容器定义,并且在每个任务定义中只使用一个容器定义是完全可以的。

至于扩展,您可以为每个任务定义创建一个服务。这允许堆栈中逻辑上分离的组件独立扩展。例如,如果您有 2 个服务,一个用于后端 api 服务,另一个用于前端 nginx,您可以为它们创建 2 个单独的任务定义,每个服务独立扩展。

将容器定义分组为单个任务定义的可能原因:

它们有一个逻辑目的或共享一个生命周期(一起开始和终止)。 您想将它们一起缩放。 您希望容器共享数据卷等资源。 容器需要在同一个主机实例上运行,并通过 localhost 进行通信等操作。

另一方面,如果容器执行单独的逻辑功能、独立扩展、不共享生命周期或资源(如卷),则最好使用多个任务定义/服务。

还有一些关于 ECS here 的应用程序架构的文档进一步解释了这一点。

【讨论】:

我同意你描述的方法,这也是我自己通过文档得到的想法;主要问题是服务发现有点棘手(如果我理解正确,它需要创建私有托管区域)并且不像在 k8s 中那样开箱即用,如果你定义 serviceAserviceB ,它们无需任何进一步的配置即可相互访问; @pkaramol 它确实需要 Route 53 中的 DNS 命名空间和托管区域。虽然不如 kubernetes 服务无缝,但使用 Route 53 自动命名 API 比以前好很多。

以上是关于如何在 AWS ECS 中扩展任务/容器的主要内容,如果未能解决你的问题,请参考以下文章

如何链接在 AWS ECS 任务中运行的 2 个容器

AWS扩展在EC2容器服务的终端保护中

如何在 AWS ECS 任务定义中配置日志

AWS ECS 使用 docker 和 nginx,如何将我的 nginx 配置放入容器中?

AWS ECS 在一个任务定义中启动多个容器

[AWS][容器][ECS] 容器动手实验201