【问题标题】:urlbased loadbalancing of websocketconnections in Kubernetes with Ingress使用 Ingress 在 Kubernetes 中基于 url 的 websocket 连接的负载平衡
【发布时间】:2020-05-26 01:53:49
【问题描述】:

我想将nginx.ingress.kubernetes.io/upstream-hash-by 用于多个客户端的 websocket 连接,其中相关客户端(基于 URL)应该坚持到同一个服务器。

当副本数量发生变化时,Ingress-nginx 似乎会重新平衡流量(pod 出现故障并将自动替换为新的副本,或者数量会随着运行时规模的增加而增加)。

重新平衡的问题在于它不会终止现有连接。因此,已经存在的 websocket 连接(对于已经散列的 URL)保留在 pod A 上,而到同一 URL 的新连接突然被分发到新生成的 pod B。

这是我的入口定义:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: websocket-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/upstream-hash-by: "$1"
spec:
  rules:
  - http:
      paths:
      - path: /socket-service/?clients/(.*)/.*
        backend:
          serviceName: websocket-test
          servicePort: 80

是否有通过关闭“重新平衡”或自动终止现有连接以某种方式控制此行为的配置?

【问题讨论】:

  • 你有没有找到解决这个问题的方法?
  • 不,我没有发现任何东西可以防止 Ingress-nginx 在 pod 更改时“重新平衡”。最后,我完全跳过了使用 Ingress,我正在我的套接字服务前面的一个 haproxy pod 中进行路由,它本身现在是一个有状态的集合,因此我可以为每个套接字分配固定的 DNS 名称-服务实例。对于 haproxy,我创建了一个 lua 脚本来使用确定性规则进行路由,以便始终将相同的 url 路由到相同的有状态集实例。

标签: kubernetes websocket routing load-balancing nginx-ingress


【解决方案1】:

我认为在这种情况下您可以查看EnvoyIstio 方向。

您可能对LoadBalancerSettings.ConsistentHashLB 标志感兴趣:

一致的基于哈希的负载均衡可用于提供软 基于 HTTP 标头、cookie 或其他属性的会话亲和性。 此负载平衡策略仅适用于 HTTP 连接。 当一个或 从目标服务中添加/删除更多主机。

来自Envoy Supported load balancers - ring-hash 文档

环/模哈希负载平衡器实现一致哈希以 上游主机。每个主机通过以下方式映射到一个圆(“环”)上 散列其地址;然后通过散列将每个请求路由到主机 请求的某些属性,并找到最近的对应 主机顺时针绕环。这种技术也是众所周知的 作为“Ketama”散列,和所有基于散列的负载均衡器一样,它是 仅在使用指定值的协议路由时有效 散列。

每个主机都经过哈希处理并多次放置在环上 与其重量成正比。例如,如果主机 A 的权重为 1 并且主机 B 的权重为 2,那么主机上可能有 3 个条目 ring:主机 A 一个,主机 B 两个。这实际上并没有提供 然而,所需的圆的 2:1 分区,因为 计算的哈希值可能巧合地非常接近;所以 有必要将每个主机的哈希数相乘——例如 在环上为主机 A 插入 100 个条目,为主机插入 200 个条目 B——更好地逼近期望的分布。最佳做法是 显式设置 minimum_ring_size 和 maximum_ring_size,并监控 min_hashes_per_host 和 max_hashes_per_host 仪表以确保良好 分配。随着环的适当分区,加法或 从一组 N 个主机中删除一个主机只会影响 1/N 请求。

使用基于优先级的负载平衡时,优先级为 也是通过哈希选择的,所以选择的端点仍然是一致的 当后端集稳定时。

【讨论】:

  • 引用的文档听起来与我要求的 nginx 具有相同的行为:一旦“后端集”不稳定,它就可以重新决定哈希所属的“映射”到哪个后端服务器,因此将来对该哈希的请求可能在另一台主机上“粘滞”。在 HTTP 调用中这可能没问题,但对于 websockets 则不然,因为现有连接不会被终止并停留在它最初连接时所属的后端。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-03
  • 2012-09-13
  • 1970-01-01
  • 2021-02-13
  • 2019-12-17
  • 2014-01-03
  • 1970-01-01
相关资源
最近更新 更多