如何利用AWS网络负载均衡器(NLB)监控两个应用负载均衡器(ALB)并将流量路由到活跃的ALB?
如何利用AWS网络负载均衡器(NLB)监控两个应用负载均衡器(ALB)并将流量路由到活跃的ALB?
嘿,我看了你碰到的这些问题,确实NLB的配置逻辑和ALB有不少差异,咱们一步步捋清楚怎么解决这个需求。
首先先明确你当前遇到的核心限制:
- NLB的Listener仅支持TCP/UDP/TLS协议,不像ALB那样能配置HTTP/HTTPS规则
- NLB Listener没法设置多规则、权重优先级这类配置,只能绑定一个默认动作
- 你误以为类型为ALB的目标组不能添加多个ALB,其实这是个误解哦
针对你“让NLB只把流量转发到健康ALB”的需求,其实有个更直接的方案,不用折腾两个Listener,咱们来拆解下:
正确的配置思路
核心是用单个目标组容纳两个ALB,借助目标组的健康检查自动剔除不健康实例,具体步骤如下:
步骤1:创建一个类型为ALB的目标组,加入两个ALB
AWS允许将多个同VPC(或符合跨VPC条件)的ALB添加到同一个NLB目标组里,你之前可能是Terraform配置的问题导致没成功。这个目标组的作用就是统一监控两个ALB的健康状态。
步骤2:配置目标组的健康检查
这里的健康检查是NLB用来判断ALB是否正常服务的依据,你需要根据实际业务调整配置:比如指定健康检查的协议(HTTP/HTTPS)、端口、健康检查路径(比如/health这类业务健康端点),确保能准确反映ALB的运行状态。
步骤3:给NLB配置单个Listener,默认转发到这个目标组
NLB的目标组会自动将不健康的ALB从转发列表中移除,只要有一个ALB健康,流量就只会流向它;如果两个都健康,NLB会按默认的轮询策略分发流量(不过你需求是只路由到活跃的,只要健康检查配置准确,故障时会自动切换)。
给你贴一段Terraform的示例代码,方便你参考:
# 创建容纳两个ALB的目标组 resource "aws_lb_target_group" "alb_target_group" { name = "multi-alb-target-group" port = 80 protocol = "TCP" vpc_id = var.your_vpc_id target_type = "alb" # 健康检查配置,按需调整 health_check { protocol = "HTTP" port = "traffic-port" path = "/health" interval = 30 timeout = 5 healthy_threshold = 2 unhealthy_threshold = 2 } } # 将第一个ALB加入目标组 resource "aws_lb_target_group_attachment" "alb1_attach" { target_group_arn = aws_lb_target_group.alb_target_group.arn target_id = aws_lb.your_alb1.arn port = 80 } # 将第二个ALB加入目标组 resource "aws_lb_target_group_attachment" "alb2_attach" { target_group_arn = aws_lb_target_group.alb_target_group.arn target_id = aws_lb.your_alb2.arn port = 80 } # 配置NLB的Listener,默认转发到目标组 resource "aws_lb_listener" "nlb_main_listener" { load_balancer_arn = aws_lb.your_nlb.arn port = "80" protocol = "TCP" default_action { type = "forward" target_group_arn = aws_lb_target_group.alb_target_group.arn } }
额外注意细节
- NLB的健康检查和ALB自身的健康检查是独立的,要确保NLB的健康检查路径能真实反映ALB的服务状态(比如如果ALB后端所有实例都挂了,ALB的健康端点应该返回失败,这样NLB才会把它标记为不健康)
- 如果你的ALB用的是HTTPS,那NLB的Listener要改成TLS协议,目标组的协议也对应调整,同时配置好证书
至于你之前想的“创建第二个Listener”的方案,其实不可行:如果两个Listener监听同一个端口,NLB会直接报错;如果监听不同端口,用户还要区分端口访问,完全不符合你“单一入口自动路由”的需求。
备注:内容来源于stack exchange,提问作者jshizzle
相关产品推荐
相关产品推荐

