ALB 中的负载均衡会话亲和策略

本指南介绍了 ALB 中可用的各种负载均衡算法,以及如何配置它们以优化应用原生应用 Pod 之间的流量分配。

概述

ALB 支持多种负载均衡算法,用于将传入流量分配到后端 Pod。算法的选择取决于您的应用需求,例如会话持久性、性能优化或负载均匀分布。

可用算法

轮询(默认)

  • 策略rr
  • 描述:按顺序循环将请求分发到所有可用的 Pod。
  • 使用场景:适用于无状态原生应用,每个请求都可以由任意 Pod 处理。

源 IP 哈希

  • 策略sip-hash
  • 描述:将来自相同源 IP 地址的请求始终路由到同一个 Pod。
  • 行为:如果存在 X-Forwarded-For 头,则使用该头中的第一个 IP,否则使用客户端的源 IP。
  • 使用场景:需要基于客户端 IP 的会话持久性时使用。
  • 策略cookie
  • 属性cookie-name(默认值为 JSESSIONID
  • 描述:将具有相同 Cookie 值的请求路由到同一个 Pod。
  • 行为
    • 如果指定的 Cookie 不存在,ALB 会将其添加到响应中
    • Cookie 格式为:timestamp.worker_pid.random_number
  • 使用场景:适用于需要基于 Cookie 实现会话粘性的应用。

基于 Header 的亲和

  • 策略header
  • 属性header-name
  • 描述:将具有相同 Header 值的请求路由到同一个 Pod。
  • 使用场景:适用于需要基于特定 HTTP 头进行路由的应用。

EWMA(指数加权移动平均)

  • 策略ewma
  • 描述:基于 Pod 响应时间,使用“二选一”算法(Power of Two Choices, P2C)结合 EWMA 进行流量路由。
  • 行为
    • 为每个 Pod 维护基于响应时间的 EWMA 分数
    • 将流量路由到 EWMA 分数较低的 Pod
    • 分数随时间呈指数衰减
  • 使用场景:适合对延迟敏感的应用
  • 参考Twitter Finagle EWMA 文档

配置方式

1. 使用 Ingress 注解

annotations:
  alb.ingress.cpaas.io/session-affinity-policy: "<algorithm>"  # rr | sip-hash | cookie | header | ewma
  alb.ingress.cpaas.io/session-affinity-attribute: "<attribute>"  # cookie 和 header 策略必填

2. 使用 ALB Frontend/Rule 自定义资源

spec:
  serviceGroup:
    session_affinity_policy: "<algorithm>"  # rr | sip-hash | cookie | header | ewma
    session_affinity_attribute: "<attribute>"  # cookie 和 header 策略必填

最佳实践

  • 对于请求模式均匀的无状态原生应用,选择轮询算法
  • 需要基于客户端 IP 的会话持久性时,使用源 IP 哈希
  • 对于需要会话粘性的 Web 应用,采用基于 Cookie 的亲和
  • 对于响应时间波动较大的服务,考虑使用 EWMA 以优化延迟