You need to enable JavaScript to run this app.
导航

Nginx Ingress 使用一致性哈希均衡负载

最近更新时间2023.12.26 19:38:55

首次发布时间2023.12.26 19:38:55

Nginx Ingress 支持一致性哈希算法,能够能够有效解决动态增删后端服务器带来的负载均衡震荡问题。本文为您介绍如何配置 Nginx Ingress 的一致性哈希算法。

背景说明

Nginx Ingress 默认支持的源 IP Hash 方法使用的是线性的 Hash 空间,系统会根据源 IP 的 Hash 运算值来选取后端的目标服务器。保证相同的源 IP 总是被分配到相同的后端服务器上。
alt

但这种方法存在一个问题,当添加或删除后端服务器时,所有源 IP 都需要重新进行 Hash 运算,以适配和重新路由到数量变化后的后端服务器。这会带来大面积的会话丢失或缓存失效。

alt

为解决上述问题,Nginx Ingress 引入了一致性哈希算法来解决该问题。一致性哈希算法通过构建环状的 Hash 空间来替代普通的线性 Hash 空间,在增加或删除后端服务器时,仅需要重新路由一小部分数据(新增或删除服务器前面的数据),能够有效解决动态增删后端服务器带来的负载均衡震荡问题。

alt

前提条件

操作步骤

Nginx Ingress 支持通过 Annotation 配置一致性哈希算法实现负载均衡,示例和说明如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress # 路由规则的名称
  annotations:
    nginx.ingress.kubernetes.io/upstream-hash-by: "$request_uri"
spec:
  ingressClassName: nginx # 指定 Ingress Controller
  rules:
  - host: example.com # 转发规则域名
    http:
      paths:
      - backend:
          service:
            name: service-demo # 请求被转发到的目标服务名称
            port:
              number: 80 # 请求被转发到的目标服务开放端口号
        path: / # 访问路径
        pathType: ImplementationSpecific

Annotation 说明如下表所示。

Key类型是否必须描述默认值

nginx.ingress.kubernetes.io/upstream-hash-by

String

一致性哈希规则。支持 nginx 参数、文本值或任意组合,例如:

  • $request_uri:表示按照请求 URI 进行 Hash。
  • $request_uri$host:表示按照请求 URI 和域名进行 Hash。
  • ${request_uri}-text-value:表示按照请求 URL 和文本值进行 Hash。

说明

更多说明,请参考 官方文档