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

red*_*888 6 amazon-web-services amazon-ecs

这是我为 Task Group 找到的唯一文档,它没有解释如何或在哪里创建一个文档

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

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

MrD*_*Duk 7

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

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

您所需要的只是放置约束(您的同一个文档),这很容易设置。如果您有启动配置,您可以将类似的内容添加到“高级”>“用户数据”部分,以便它在启动期间运行(或者只是在手动启动实例时添加它(或者如果您感觉异常黑客,您可以登录到您的实例并手动运行命令..为了科学和其他东西)):

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

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

因此,现在您已经有了一个正确标记的实例(并确保它只是您想要的单个实例(这意味着您可能需要针对这种特定类型的实例的专用启动配置)),您可以继续创建 ECS 服务,例如你想做的事。但是,请确保正确设置任务放置,以匹配现在为实例配置的角色:

废话

因此,对于上面的示例,此服务配置为仅在配置为 和 的实例上启动此任务env==prod-secondary==app2由于您的其他两个实例配置为secondary==app2,因此不允许它们托管此任务。

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


AWS 支持的回复

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

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

创建后,您将注意到一个任务正在与一个组一起运行:webserver

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

"placementConstraints": 
[ 
  { 
    "expression": "task:group == webserver", "type": "memberOf" 
  } 
] 
Run Code Online (Sandbox Code Playgroud)

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

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