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

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

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

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

【问题讨论】:

    标签: amazon-web-services amazon-ecs


    【解决方案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 执行服务执行的相同操作,但这会非常乏味。
    猜你喜欢
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 2020-01-08
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    • 2016-01-19
    相关资源
    最近更新 更多