Published on

AWS ELB ALB NLB 关联与区别

Authors
  • avatar
    Name
    Mao
    Twitter

本文介绍 AWS 负载均衡服务 ELB(Elastic Load Balancer), ALB(Application Load Balancer), NLB(Network Load Balancer) 之间的关联与区别,以及使用场景。

共同点

  1. 工作模式都是接收外部流量,转发给后端服务(EC2或容器)。
  2. 支持健康检查,隔离不健康的实例(EC2或容器)。
  3. 支持SSL证书卸载。
  4. 指标与日志对接到CloudWatch。
  5. 如果存在“突发”超大流量场景,可以联系AWS为负载均衡器提前预热:pre-warm

经典负载均衡器 ELB

ELB是AWS最早的负载均衡器,在2009年时候推出。ELB支持4层与7层转发,且是EC2-Classic唯一配套的负载均衡器。同时,如果你需要根据自定义cookie实现session粘滞转发,那么也只有ELB支持(ALB使用自动生成的cookie实现session粘滞转发,不允许使用自定义cookie)。

在7层转发能力上,支持证书卸载,同时支持重加密(使用自签名证书);通过这种方式实现端到端加密,以满足某一些合规场景。

ELB存在一些限制,包括:不支持转发到EKS底座的Farget服务上的容器实例;不支持转发到一个实例的多个端口;不支持转发到指定的IP地址、只能转发到指定的EC2或容器实例;不支持websocket协议(可使用4层转发方式替代)。

在NLB和ALB上线之后,AWS就不推荐使用ELB服务,但是在某些场景下,还必须选择使用ELB服务:工作负载运行在EC2-Classic实例上;或者需要根据自定义cookie实现session粘滞转发策略。

下一代负载均衡器 ELB v2

在2016年,AWS上线了Elastic Load Balancing v2版本,包含两个服务:ALB、NLB。ELB v2引入了"target group"概念,请求先转发到target group, traget group再转发到实例、容器、或IP地址。流量拆分由target group完成。

NLB和ALB都支持转发到指定的IP地址,这种方式可以实现将流量转发到租户的on-premise数据中心。

ALB

ALB 仅提供7层转发。支持多种转发规则,包含:host, path, query parameter, http method, http header, source ip, port。相比较与ELB,ALB支持转发到实例的多个端口,支持转发到Lambda函数。

ALB 还支持返回固定的响应体或重定向。支持HTTP/2协议,支持websocket协议。

ALB 支持 SNI(Server Name Indication),用于多域名场景。最多能支持25条SNI记录。

ALB 支持多种认证协议(与认证服务对接),包括:OIDC, SAML, LDAP, Microsoft AD, 社交账号如Facebook/Google。此特性能够在ALB上实现认证卸载。

NLB

NLB 仅提供4层转发,支持TCP与UDP协议,且支持TLS。NLB 最大亮点是高性能。同时支持绑定static IP 或 Elastic IP,这个特性是ALB和ELB都不支持的。

NLB 默认支持获取源IP地址,而ALB、ELB只能是在HTTP header中设置源IP地址。

特性对比

ALBNLBELB
Basic load balancing features
Balance load between targetsYesYesYes
Perform health checks on targetsYesYesYes
Highly availableYesYesYes
ElasticYesYesYes
TLS TerminationYesYesYes
PerformanceGoodVery highGood
Send logs and metrics to CloudWatchYesYesYes
Layer 4 (TCP)NoYesYes
Layer 7 (HTTP)YesNoYes
Running costsLowLowLow
Advanced load balancing features
Advanced routing optionsYesN/ANo
Can send fixed response without backendYesNoNo
Supports user authenticationYesNoNo
Can serve multiple domains over HTTPSYesYesNo
Preserve source IPNoYesNo
Can be used in EC2-ClassicNoNoYes
Supports application-defined sticky session cookiesNoN/AYes
Supports Docker containersYesYesYes (*)
Supports targets outside AWSYesYesNo
Supports websocketsYesN/ANo
Can route to many ports on a given targetYesYesNo

(*) Except for EKS with Fargate

Reference

ELB vs. ALB vs. NLB: Choosing the Best AWS Load Balancer for Your Needs

Best Practices in Evaluating Elastic Load Balancing