NLB目标群体健康检查失控

时间:2018-01-07 08:17:55

标签: amazon-web-services amazon-ec2 amazon-cloudformation amazon-elb

我有一个网络负载均衡器和一个关联的目标组,它被配置为对EC2实例进行运行状况检查。问题是我看到了很多健康检查请求;每秒多次。

检查之间的default interval应该是30秒,但它们的频率比它们应该高出约100倍。

我的堆栈是在CloudFormation中构建的,我已经尝试覆盖HealthCheckIntervalSeconds,这没有任何效果。有趣的是,当我尝试在控制台中手动更改间隔时,我发现这些值是灰色的:

Edit Healthcheck Settings

以下是模板的相关部分,我尝试更改注释的区间:

NLB:
  Type: "AWS::ElasticLoadBalancingV2::LoadBalancer"
  Properties:
    Type: network
    Name: api-load-balancer
    Scheme: internal
    Subnets: 
      - Fn::ImportValue: PrivateSubnetA
      - Fn::ImportValue: PrivateSubnetB
      - Fn::ImportValue: PrivateSubnetC

NLBListener:
  Type : AWS::ElasticLoadBalancingV2::Listener
  Properties:
    DefaultActions:
      - Type: forward
        TargetGroupArn: !Ref NLBTargetGroup
    LoadBalancerArn: !Ref NLB
    Port: 80
    Protocol: TCP

NLBTargetGroup:
  Type: AWS::ElasticLoadBalancingV2::TargetGroup
  Properties:
    # HealthCheckIntervalSeconds: 30
    HealthCheckPath: /healthcheck
    HealthCheckProtocol: HTTP
    # HealthyThresholdCount: 2
    # UnhealthyThresholdCount: 5
    # Matcher:
    #   HttpCode: 200-399
    Name: api-nlb-http-target-group
    Port: 80
    Protocol: TCP 
    VpcId: !ImportValue PublicVPC

我的EC2实例位于私有子网中,无法访问外部世界。 NLB是内部的,因此如果不通过API网关,就无法访​​问它们。 API网关没有配置/healthcheck端点,因此可以排除来自AWS网络外部的任何活动,例如手动ping端点的人员。

这是我从CloudWatch获取的应用程序日志的示例,而应用程序应该处于空闲状态:

07:45:33 {"label":"Received request URL","value":"/healthcheck","type":"trace"}
07:45:33 {"label":"Received request URL","value":"/healthcheck","type":"trace"}
07:45:33 {"label":"Received request URL","value":"/healthcheck","type":"trace"}
07:45:33 {"label":"Received request URL","value":"/healthcheck","type":"trace"}
07:45:34 {"label":"Received request URL","value":"/healthcheck","type":"trace"}
07:45:34 {"label":"Received request URL","value":"/healthcheck","type":"trace"}
07:45:34 {"label":"Received request URL","value":"/healthcheck","type":"trace"}
07:45:35 {"label":"Received request URL","value":"/healthcheck","type":"trace"}
07:45:35 {"label":"Received request URL","value":"/healthcheck","type":"trace"}
07:45:35 {"label":"Received request URL","value":"/healthcheck","type":"trace"}

我每秒通常会收到3到6个请求,所以我想知道这是否就像网络负载均衡器的工作方式一样,而AWS仍然没有记录(或者我没有& #39; t发现它,或者我如何解决这个问题。

4 个答案:

答案 0 :(得分:15)

更新:已在相关的aws forum post上回答了这一点,这证实了它对网络负载均衡器的正常行为,并引用了它们的分布式性质作为原因。无法配置自定义间隔。此时,文档仍然过时,另有说明。

这可能是NLB目标组中的错误,也可能是错误documentation的正常行为。我得出这个结论是因为:

  • 我确认健康检查来自NLB
  • 配置选项在控制台上显示为灰色
    • 推断AWS了解或强加此限制
  • others
  • 正在观察到相同的结果
  • 该文档专门针对网络负载均衡器
  • AWS文档通常会引导您进行疯狂的追逐

在这种情况下,我认为可能是正常行为被错误地记录下来,但除非有人来自AWS,否则无法验证,并且几乎不可能获得在aws论坛上回答issue like this

能够配置设置或者至少更新文档会很有用。

答案 1 :(得分:2)

AWS员工在这里。为了详细说明已接受的答案,您可能会看到大量健康检查请求的原因是NLB使用多个分布式健康检查器来评估目标健康。这些运行状况检查器将按您指定的时间间隔向目标发出请求,但是所有这些检查器都将在该时间间隔向目标发出请求,因此您将看到每个分布式探针发出的一个请求。然后根据成功探测到的探针数量来评估目标健康状况。

您可以在“ A Route 53健康检查”下阅读另一位AWS员工在此处写的非常详细的说明:https://medium.com/@adhorn/patterns-for-resilient-architecture-part-3-16e8601c488e

我对运行状况检查的建议是将运行状况检查代码编写得非常轻。许多人会犯错误,使他们的运行状况检查超负荷运行,同时还会执行诸如检查后端数据库或运行其他检查之类的操作。理想情况下,您的负载均衡器的运行状况检查除了返回“ OK”之类的短字符串外,什么也不做。在这种情况下,您的代码将需要不到一毫秒的时间来运行健康检查请求。如果您遵循这种模式,那么偶尔出现6-8次健康检查请求就不会使您的过程过载。

答案 2 :(得分:0)

在这方面晚了一点。但是对我有用的是让我的(C ++)服务启动一个专用于来自ELB的运行状况检查的线程。线程等待套接字连接,然后等待从套接字读取;或遇到错误。然后,它关闭套接字并返回以等待下一次运行状况检查ping。这比让ELB一直吸引我的流量端口便宜。它不仅使我的代码认为它受到了攻击,而且还浪费了所有物流以及为真正的客户提供服务所需的物流。

答案 3 :(得分:-1)

AWS负载平衡器上的运行状况检查间隔为每个区域 ,因此您必须将间隔除以total number of regions。对于网络负载均衡器,似乎间隔和区域集都无法更改。

您真正可以定义区域集的唯一地方是Route53运行状况检查,您可以在其中将区域集减少到最少三个。使用Terraform就像

resource "aws_route53_health_check" "http-check" {
  fqdn = "my.domain.name"
  port = 80
  type = "HTTP"
  resource_path = "/health"
  failure_threshold = "5"
  request_interval = "30"
  regions = ["us-east-1", "eu-west-1", "ap-northeast-1"]
}