【问题标题】:Exposing to public more than 1 port with AWS ECS service and Elastic LoadBalancer使用 AWS ECS 服务和 Elastic LoadBalancer 向多个公共端口公开
【发布时间】:2020-01-03 01:32:16
【问题描述】:

我的服务可以公开多个端口,并且它在 kubernetes 上运行良好,但现在我们将其移至 AWS ECS。看来我只能通过负载均衡器公开端口,即使 docker 定义了多个端口,我也仅限于每个服务/任务 1 个端口,我必须选择一个端口

Add to load balancer 按钮允许添加一个端口。添加后没有添加第二个端口的按钮。

有没有比让第二个代理服务公开第二个端口更好的解决方法?

更新:我使用基于 Fargate 的服务。

【问题讨论】:

  • 是否要将来自同一目标组的请求路由到该服务?
  • 我希望服务公开 80 和 443 端口并在这些端口上点负载均衡器。否则我需要额外的服务来复制重定向到 443 的端口 80。
  • 你可以做到。如果您使用动态主机端口,那么容器的端口是什么实际上并不重要。此外,需要保持两个端口不同,因为您想在一个 ECS 服务中执行此操作。请按照我的回答来实现您的目标。

标签: amazon-web-services amazon-ecs serverless amazon-elb aws-fargate


【解决方案1】:

更新: 我能够使用 Terraform 配置目标组,但目前在 AWS 控制台上没有找到此选项。

resource "aws_ecs_service" "multiple_target_example" {
  name            = "multiple_target_example1"
  cluster         = "${aws_ecs_cluster.main.id}"
  task_definition = "${aws_ecs_task_definition.with_lb_changes.arn}"
  desired_count   = 1
  iam_role        = "${aws_iam_role.ecs_service.name}"

  load_balancer {
    target_group_arn = "${aws_lb_target_group.target2.id}"
    container_name   = "ghost"
    container_port   = "3000"
  }

  load_balancer {
    target_group_arn = "${aws_lb_target_group.target2.id}"
    container_name   = "ghost"
    container_port   = "3001"
  }

  depends_on = [
    "aws_iam_role_policy.ecs_service",
  ]
}

版本说明: Terraform AWS Provider 版本 2.22.0 中添加了多个 load_balancer 配置块支持。

ecs_service_terraform

我不能说这将是一个很好的解决方法,但我正在处理一个需要使用 AWS ECS 运行 Ejabberd 的项目,但是在将服务端口绑定到负载均衡器时发生了同样的问题。

我正在使用 terraform,由于 AWS ECS 的这种限制,我们同意每个实例运行一个容器来解决端口问题,因为我们应该公开两个端口。

如果您不想为容器分配动态端口,并且希望每个实例运行一个容器,那么该解决方案肯定会奏效。

  1. 创建一个目标组并指定容器的第二个端口。

  2. 转到您的 ECS 集群的 AutoScalingGroups

  3. 在 ECS 集群的 Autoscaling 组中编辑并添加新创建的目标组

因此,如果您扩展到两个容器,则意味着会有两个实例,因此新启动的实例将注册到第二个目标组,并由 Autoscaling 组负责处理。 这种方法在我的情况下运行良好,但需要考虑的事情很少。

不要绑定目标中的主端口,最好绑定主端口 ALB 服务。这种方法的主要优点是,如果您 容器未能响应 AWS 运行状况检查 容器将被 自动重启。由于目标组健康检查不会重新创建您的容器。

当 Docker 容器中存在动态端口暴露时,此方法将不起作用。

AWS 应更新其 ECS 代理以处理此类情况。

【讨论】:

  • 您使用过 EC2 或 Fargate 服务吗?我使用法门。是instance EC2 实例吗?
  • 是的,我们使用的是 EC2 类型的服务,Fargate 有更多的限制,所以我们转移到了 EC2 类型的 ecs 服务。
  • @Adiii CodeDeploy 怎么样,我们如何将蓝/绿部署与其集成。因为codeDeploy仍然不支持多目标组
  • 蓝绿部署,可以试试动态端口。
【解决方案2】:

我在为每个实例创建多个容器时遇到了这个问题,并且第二个容器没有出现,因为它使用了任务定义中定义的相同端口。

我们所做的是,在这些容器之上创建了一个应用程序负载均衡器,并删除了硬编码端口。当应用程序负载均衡器没有得到它下面的预定义端口时,它会做什么,使用动态端口映射的功能。容器将出现在随机端口并驻留在一个目标组中,负载均衡器会自动将请求发送到这些端口。

更多详情可以查看here

【讨论】:

    【解决方案3】:

    您不需要任何解决方法,AWS ECS 现在支持同一 ECS 服务中的多个目标组。这对于您想要公开容器的多个端口的用例很有帮助。

    目前,如果您要创建指定多个目标组的服务,则必须使用 Amazon ECS API、开发工具包、AWS CLI 或 AWS CloudFormation 模板创建服务。创建服务后,您可以通过 AWS 管理控制台查看服务和注册到该服务的目标组。

    例如,一个 Jenkins 容器可能会为 Jenkins Web 界面和 API 端口 50000。

    参考:

    https://docs.aws.amazon.com/AmazonECS/latest/developerguide/register-multiple-targetgroups.html

    https://aws.amazon.com/about-aws/whats-new/2019/07/amazon-ecs-services-now-support-multiple-load-balancer-target-groups/

    【讨论】:

    • 这不适用于 ECS 蓝/绿部署,仅适用于滚动更新。请参阅“多个目标群体注意事项”下的here
    猜你喜欢
    • 2019-12-18
    • 1970-01-01
    • 2015-02-13
    • 2020-06-17
    • 2020-02-04
    • 2020-08-09
    • 1970-01-01
    • 2014-11-07
    • 1970-01-01
    相关资源
    最近更新 更多