使用动态端口映射时目标组中的端口错误

问题描述 投票:0回答:2

我正在尝试使用动态端口映射、应用程序负载均衡器和 Auto Scaling 组设置 ECS。一切都工作正常,直到我将任务定义中的 hostPort 更改为 0。

现在在目标组中,目标正在使用容器端口(例如 80 或 8080)注册,而不是动态分配的端口,并且由于应用程序无法在此主机端口上运行,因此运行状况检查失败。之后,注册了具有正确端口的目标,但由于其他目标(具有相同实例 ID)的运行状况检查失败,该实例进入耗尽状态。

目前,我已将运行状况检查类型更改为 EC2,我仍然有两个注册目标,一个容器端口不健康,一个动态分配端口健康,但实例正在运行。

我在 EC2 安全组中打开了所有端口,我使用默认网络模式(在本例中为桥接模式),并且我将流量端口作为目标组中的设置。我也在我的 ASG 中使用了 Spot 实例,但我认为这不会有任何区别。这里可能有什么问题?

谢谢您的帮助!

amazon-web-services amazon-ec2 amazon-ecs amazon-elb aws-application-load-balancer
2个回答
0
投票

要“强制”目标组使用动态容器端口,您必须在健康检查信息中设置“流量端口”。

假设您正在使用 terraform:

resource aws_alb_target_group this {
  name = "webapi"
  port = 80 # this is the "public" port, that means, container port mapped to outside
  protocol = "HTTP"
  target_type = "instance" # this also plays a role. You have to put instance, otherwise you'll need to inform port in healthcheck
  vpc_id = var.vpc_id
  health_check {
    enabled = true
    path = "/api/version"
    interval = 30
    protocol = "HTTP"
    healthy_threshold = 3
    unhealthy_threshold = 3
    port = "traffic-port" # this is the default value
  }
}

0
投票

如果您使用配置了 Apache 的常规 EC2 实例(例如),您将在 ASG 中使用“ELB”运行状况检查,并且您的目标组将引用服务端口(例如 80)。这样,当 URL 失败时,ALB+ASG 会认为该实例可能不健康。

但是,在使用动态端口映射的容器上下文中,由 ALB+ECS 决定容器的运行状况,ECS 代理负责使用动态端口映射更新目标组以进行 ALB 流量路由。因此,在 ASG 中,您将使用“EC2”系统运行状况检查来监控实例状态。更重要的是,您不会将目标组 ARN 附加到 ASG,即使它作为 Terraform 属性存在。因为将 TG 附加到 ASG 会将 ALB 关联到 ASG,从而在服务端口 80 处创建不正常的 TG 条目。跳过 ASG 中的 TG ARN,服务端口幻象将消失。

您仍然使用 TG 中的真实服务端口,但它加上运行状况检查 URL 仅充当 ECS 代理从生成的容器中回填动态端口信息时的占位符。

© www.soinside.com 2019 - 2024. All rights reserved.