【发布时间】: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