【问题标题】:How to load balance sockets using ingress nginx如何使用入口 nginx 负载平衡套接字
【发布时间】: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


【解决方案1】:

我假设您使用以下架构来访问您的 pod:

入口控制器 ---> kubernetes 服务 ---> kubernetes 部署 (POD)

如果是这种情况,那么您已经在使用具有统计循环策略的负载平衡。为此,我会得出结论,您的部署只有一个副本。通过运行kubectl describe deployment $YOUR_DEPLOYMENT 检查副本数量。通过运行kubectl scale deployment --replicas=5 增加副本数量。

如果您使用不同的架构,我需要对其进行检查,以验证负载平衡为何不起作用。您很可能没有使用 Deployment bud 和 Pod 来部署您的容器。

【讨论】:

  • 是的,我正在使用您描述的架构,我已经有 3 个副本:副本:需要 3 个 | 3 更新 |共 3 个 | 3 个可用 | 0 不可用
  • 好的,那你怎么知道只使用了一个 pod?正如我提到的,一个普通的 kubernetes 服务默认使用统计循环策略。
  • 我在每个副本上使用:kubectl log -f $POD_NAME。每次我有一个新的套接字连接时,我都会打印套接字的 ID。打印只出现在一个吊舱中。
猜你喜欢
  • 2020-12-29
  • 1970-01-01
  • 2013-08-13
  • 2023-03-14
  • 1970-01-01
  • 2016-11-19
  • 1970-01-01
  • 2013-03-01
  • 2018-09-24
相关资源
最近更新 更多