目标组在端口 80 上的健康检查不断失败,并在使用动态端口映射时启动新实例

Posted

技术标签:

【中文标题】目标组在端口 80 上的健康检查不断失败,并在使用动态端口映射时启动新实例【英文标题】:Target group constantly fails health check on port 80 and launches new instances when using dynamic port mapping 【发布时间】:2022-01-03 16:25:42 【问题描述】:

我有一个 ECS 集群和一个应用程序负载均衡器。我在aws's docs 之后为 Amazon ECS 设置了动态端口映射。

问题是我的实例的端口 80 被注册为我的目标组中的目标,这总是失败(这会因为容器暴露在临时端口范围 32768 - 65535:

因此,我不断启动新 EC2 实例并终止现有实例的 Autoscaling 组

下面是我创建 ALB、侦听器和 target_group 的 Tarraform 配置文件:

resource "aws_alb" "default" 
  name               = "$var.app_name-$var.app_environment-alb"
  load_balancer_type = "application"
  internal           = true
  subnets         = var.loadbalancer_subnets
  security_groups = [aws_security_group.load_balancer_security_group.id]


resource "aws_lb_listener" "default" 
  load_balancer_arn = aws_alb.default.arn
  port              = "80"
  protocol          = "HTTP"

  default_action 
    type             = "forward"
    target_group_arn = aws_lb_target_group.default.arn
  


resource "aws_lb_target_group" "default" 
  name_prefix = "rushmo"
  port        = 80
  protocol    = "HTTP"
  vpc_id      = var.vpc_id
  target_type = "instance"

  health_check 
    healthy_threshold   = "2"
    unhealthy_threshold = "5"
    interval            = "300"
    port                = "traffic-port"
    path                = "/"
    protocol            = "HTTP"
    matcher             = "200,301,302"
  



resource "aws_autoscaling_group" "default" 
  name             = "$var.app_name-$var.app_environment-ASG"
  desired_capacity = 1
  health_check_type         = "ELB"
  health_check_grace_period = 600 # 10 min
  launch_configuration      = aws_launch_configuration.default.name
  max_size                  = 1
  min_size                  = 1

  target_group_arns    = [aws_lb_target_group.default.arn]
  termination_policies = ["OldestInstance"]

  vpc_zone_identifier = var.application_subnets
  protect_from_scale_in = true

注意:如果我从目标组手动取消注册端口 80 上的目标,则不断终止和启动新实例的问题得到解决,但我不明白我做错了什么并且为什么这个端口 80 显示为注册目标,而不仅仅是临时端口范围

【问题讨论】:

【参考方案1】:

我认为问题是由于:

health_check_type         = "ELB"

这使得 ASG 在您的实例的端口 80 上使用 ALB 的运行状况检查。但是,由于您使用的是 ECS,因此健康检查应仅用于您的容器,而不是实例本身。因此它应该是:

health_check_type         = "EC2"

【讨论】:

@GeorgiKoemdzhiev 也许他们是在 TF 之外手动注册的?无论如何,如果您觉得答案有帮助,我们将不胜感激。 谢谢马尔辛。这种变化实际上解决了不断终止/启动实例的问题。但是,我仍然在我的目标组中看到 2 个目标注册为端口 80(始终不健康)和另一个用于容器(在本例中为 50131)。这正常吗? 谢谢,我可以尝试重新创建我的环境,看看是否可以摆脱端口 80 目标。

以上是关于目标组在端口 80 上的健康检查不断失败,并在使用动态端口映射时启动新实例的主要内容,如果未能解决你的问题,请参考以下文章

谷歌云健康检查失败

弹性beantalk上的spring boot应用程序-健康检查失败

如何修复弹性beantalk实例上的“使用这些代码失败的健康检查:”?

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

移动网络中 8080 或 80 端口上的 WebSocket 连接失败

CodeDeploy allowTraffic失败,但我的代码仍然部署在实例上