7

我正在将一些工作负载迁移到 Amazon ECS Container Service,但我发现了一个阻碍我前进的障碍。

理想情况下,在 ECS 上运行的容器化应用程序应该是无状态的,以便它们可以在任何集群实例中运行并横向扩展。但现实情况是,我有一些依赖于 EBS 数据量的应用程序。据我所知,这些卷必须手动附加到特定的集群实例,并且 ECS 应用程序应该放置在该实例中以便能够访问其数据,因此我需要有一些方法来控制这些最终运行的位置。

例如,假设我们有一个由 Amazon ECS 管理的由 3 个 EC2 实例组成的集群。

  • 实例1
  • 实例2
  • 实例3

然后我们有 2 个容器化应用程序:

  • app1,它是无状态的
  • app2,这取决于 EBS 卷

app1 可以在集群的任何实例中运行,没有问题。

对于 app2,假设我们在 instance2 中附加和挂载 EBS 卷。

现在,问题是:我可以在定义或启动 app2 时限制仅放置在 instance2 中,以便它可以访问 EBS 卷吗?

提前非常感谢!


编辑:

我进一步阅读并在亚马逊的文档中找到了一种方法。文档“<a href="http://docs.aws.amazon.com/AmazonECS/latest/developerguide/using_data_volumes.html" rel="noreferrer">在任务中使用数据卷”中有一条说明:

重要的

Amazon ECS 不会跨容器实例同步您的数据卷。使用持久数据卷的任务可以放置在集群中具有可用容量的任何容器实例上。如果您的任务在停止和重新启动后需要持久数据卷,您应该始终在任务启动时使用 AWS CLI start-task 命令指定相同的容器实例。

因此,查看 CLI 上的start-task命令,我发现它正是我要寻找的:

开始任务

从指定容器实例或实例上的指定任务定义启动新任务。要使用默认 Amazon ECS 计划程序来放置您的任务,请改用 run-task。

它有两个必需参数,即您要启动的任务定义和应在其上运行任务的容器实例ID(最多 10 个)。

所以调用命令看起来像这样:

aws ecs start-task --task-definition “hello-world:1” --container-instances “1c66549d-b41c-4439-dd43-c2e1c9a2cc2a” 

我试过了,效果很好。

目前,这似乎是唯一的方法,因为 AWS Web UI 没有在启动任务时提供指定容器实例的字段。

我希望它对某人有用。

4

2 回答 2

8

ECS 现在支持放置约束。

请参阅http://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-placement-constraints.html

所以步骤是:

  • Name=App1在此处为每个实例(例如, )指令定义自定义属性
  • 为每个任务定义定义约束(例如,MemberOf = attribute:Name =~ App1

它应该工作。

于 2017-01-19T09:48:08.600 回答
4

亚马逊最近推出了一项新服务,即弹性文件系统 (EFS),该服务旨在跨多个实例以及任何容器同步数据。

EFS 的引入是对您无法轻易将 EBS 用于容器工作负载的承认。

这是有关将 EFS 与 ECS 结合使用的入门和教程。

EFS 建立在 NFS 之上。NFS 协议和 EFS 实现在网络 IO 和数据吞吐量方面确实存在一些挑战,因此它可能不适合您的工作负载。

于 2016-09-21T16:55:39.217 回答