限制服务/应用程序在特定的Amazon ECS实例中运行

adr*_*nmo 7 amazon-ec2 amazon-web-services amazon-ecs

我正在将一些工作负载迁移到Amazon ECS容器服务,我发现了阻止我继续前进的阻止程序.

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

举个例子,假设我们有一个由Amazon ECS管理的3个EC2实例的集群.

  • INSTANCE1
  • INSTANCE2
  • instance3

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

  • app1,这是无国籍的
  • app2,取决于EBS卷

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

对于app2,假设我们在instance2中附加并安装EBS卷.

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

非常感谢提前!


编辑:

我已经进一步阅读了,我找到了一种方法在亚马逊的文档中做到这一点.文档" 在任务中使用数据卷 "中有一条说明:

重要

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” 
Run Code Online (Sandbox Code Playgroud)

我尝试过它,效果很好.

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

我希望它对某些人有用.

小智 7

ECS现在支持放置约束.

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

所以步骤是:

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

它应该工作.


Noa*_*hke 4

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

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

以下是有关将 EFS 与 ECS 结合使用的入门知识和教程。

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