【发布时间】:2020-02-08 07:36:17
【问题描述】:
在 kubernetes 中,我部署了 3 个负责套接字的 pod。
我希望对部署的 pod 之间的流量进行负载平衡。为此,我使用通过 Helm 安装的 NGINX Ingress 控制器,使用图表 stable/nginx-ingress。
问题是客户端总是连接到同一个 pod。没有平衡。
为了测试负载平衡,我使用了几部手机来使用数据(2-6 部手机)。他们每个人都打开一个套接字连接。
我有 2 条入口规则。对于我正在使用的套接字:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-socket-service
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/websocket-services: "node-socket-service"
nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
nginx.ingress.kubernetes.io/upstream-hash-by: "$host"
spec:
tls:
- hosts:
- example.com
rules:
- host: example.com
http:
paths:
- path: /socket.io/
backend:
servicePort: 4000
serviceName: node-socket-service
服务:
apiVersion: v1
kind: Service
metadata:
name: node-socket-service
spec:
type: ClusterIP
selector:
component: node-socket
ports:
- port: 4000
targetPort: 4000
我尝试将upstream-hash-by的值更改为:$binary_remote_addr$remote_addr$hostewma$request_uri,不成功...
我想知道我进行测试的方式是否良好。可能是负载平衡运行良好,但需要更多客户端。
【问题讨论】:
-
您好,您使用什么集群基础架构/平台?还有你安装了什么 Kubernetes 版本和网络插件/CNI?
-
嗨,我在 DigitalOcean 上使用 K8s v1.14.5。我从来没有安装任何网络插件/CNI,我以为我有默认的(我是初学者,我不太了解 K8s 的这一部分)。
-
有什么消息吗?你的问题解决了吗?
-
我猜 $request_uri 对于所有连接都是一样的。会不会因为 Ingress 前面有反向代理,$host、remote_addr 等也一样?我在私有托管数据中心中使用 kubernetes,并且请求者 IP 始终相同(集群/入口前面的缩放器/平衡器)。为了达到您的要求,您不能完全删除 upstream-hash-by 吗?它应该只是将其随机分发到所有 pod。
-
"...并且请求者 IP 始终相同"这可能是一种解释(我正在使用带有 loadBalancer 的 DigitalOcean )。因为我使用的是套接字,所以我需要使用 upstream-hash-by 来启用基于 IP 的粘性会话。
标签: nginx kubernetes socket.io load-balancing kubernetes-ingress