什么是 ECS 任务组,如何创建?

Posted

技术标签:

【中文标题】什么是 ECS 任务组,如何创建?【英文标题】:What is an ECS Task Group and how do I create one? 【发布时间】:2018-08-13 09:36:49 【问题描述】:

这是我为任务组找到的唯一doc,它没有解释如何或在哪里创建一个。

我找不到任何文档来充分解释任务组的实际含义,并举例说明如何创建和使用任务组。这听起来像是服务运行多个不同任务定义的一种方式,这对我很有用。

例如,我在任务定义中添加了一个容器,并且该服务正在集群上平衡它的多个实例。但是我想与第一个容器一起部署另一个容器,但我只想运行它的一个实例。所以我不能将它添加到同一个任务定义中,因为我会创建它的多个实例并消耗不必要的资源。似乎这就是任务组的用途。

【问题讨论】:

【参考方案1】:

您确实是正确的,没有关于此的适当文档(我向我们的 AWS 团队打开了一个支持案例来验证!)。

但是,一切都没有丢失。确实存在解决您难题的解决方案,并且是我们每天使用的解决方案。您不必使用任务组,不管是什么(因为我们实际上还不知道(AWS 工程师正在为我编写一些文档,当我得到它们时会将它们发布在这里) )。

您所需要的只是 放置约束(您的同一个文档),它们很容易设置。如果您有启动配置,您可以在 Advanced > User Data 部分添加类似的内容,以便它在启动期间运行(或者只是在手动启动实例时添加它(或者如果您感觉异常hacky,您可以登录到您的实例并手动运行 commands.. 用于科学和东西)):

echo ECS_INSTANCE_ATTRIBUTES=\"env\": \"prod\",\"primary\": \"app1\",\"secondary\": \"app2\" >> /etc/ecs/ecs.config

引号中的所有内容都是由您任意定义的,因此请使用对您的用例有意义的任何标签和值。如果你走这条路,请确保将以下行添加到 docker 启动命令中:--env-file=/etc/ecs/ecs.config

既然您有一个正确标记的实例(并确保它只是您想要的单个实例(这意味着您可能需要针对这种特定类型的实例进行专门的启动配置)),您可以继续创建您的ECS 服务就像您想做的那样。但是,请确保您正确设置任务放置,以匹配现在为您的实例配置的角色:

因此,对于上面的示例,此服务配置为仅在为 env==prodsecondary==app2 配置的实例上启动此任务——因为您的其他两个实例没有配置对于secondary==app2,不允许他们主持这个任务。

一开始可能会让人感到困惑,我们花了一段时间才弄好,但我希望这会有所帮助!


来自 AWS 支持的响应

我研究了如何使用任务组的过程,以下是我的发现: - 如果您有从 RunTask/StartTask 启动的现有任务,假设您已经有一个名为“databases”的任务组 API。

当您使用 RunTaskStartTask 操作启动任务时,您可以为该任务指定任务组的名称。如果您没有为任务指定任务组,则默认名称是任务定义的家族名称(例如,family:my-task-definition) - 因此要创建任务组,您可以定义一个 TaskGroup(比如webserver)在任务控制台上创建任务或使用以下命令:$ aws ecs run-task --cluster <ecs-cluster> --task-definition taskGroup-td:1 --group webserver

创建后,您会注意到一个与组一起运行的任务:webserver

现在,您可以将以下放置约束与任务定义一起使用,将您的任务仅放置在使用此任务组运行任务的容器上。

"placementConstraints": 
[ 
   
    "expression": "task:group == webserver", "type": "memberOf" 
   
] 

如果您尝试使用上述placementConstraint 运行任务,但没有任何使用taskGroup : webserver 运行的任务,您将收到以下错误:Run tasks failed Reasons : ["memberOf constraint unsatisfied"]

参考:https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-placement-constraints.html

【讨论】:

很好的响应,但是如果唯一的方法是一次性配置单个 EC2 实例,这会很糟糕。我使用 terraform 构建集群并将其视为统一的不可变服务器集合。有点震惊,没有办法在更高的层次上做到这一点 我对 Terraform 不是很熟悉,所以我不能帮你。我确实收到了 AWS 关于如何创建和使用任务组的回复,我已将其添加到答案中。希望对你有帮助 嗯,如果您使用服务“对于服务调度程序启动的任务,任务组名称是服务的名称”,那么任务组似乎毫无意义。所以我必须定义一个新的服务。 ECS 是一团糟 :( 还不错 - 创建第二个服务来专门管理您要运行的 1-off additional 容器似乎是一种体面的责任分离。祝你好运! 是的,没错。您的容器编排魔法(大部分情况下)只发生在服务中。您可以通过 CloudWatch 和 Lambda 执行服务执行的相同操作,但这会非常乏味。

以上是关于什么是 ECS 任务组,如何创建?的主要内容,如果未能解决你的问题,请参考以下文章

用于 ECS 任务/容器的 Terraform AWS CloudWatch 日志组

最小任务数,ECS

AWS 目标组在同一个 ECS 任务上注册 2 个目标?

ECS服务不断注销目标组和启动/停止任务

如何使用 SDK 为 ecs 服务的弹性伸缩策略设置最小和最大任务?

如何从 AWS Lambda 函数运行 ECS 任务?