使用Socket.io、ExpressJS和Nginx入口的Kubernetes WebSocket

使用Socket.io、ExpressJS和Nginx入口的Kubernetes WebSocket,kubernetes,websocket,socket.io,google-kubernetes-engine,nginx-ingress,Kubernetes,Websocket,Socket.io,Google Kubernetes Engine,Nginx Ingress,我想使用Socket.io将React本机应用程序连接到托管在Google云平台(GKE)上的Kubernetes集群内的服务器 Nginx入口控制器声明似乎有问题,但我找不到 我尝试添加nginx.org/websocket服务;重写我的后端代码,使其在端口3004上使用单独的NodeJS服务器(一个简单的HTTP服务器),然后通过入口控制器将其暴露在与端口3003不同的路径下;以及来自其他SO问题和Github问题的多个其他建议 可能有用的信息: 集群主版本:1.15.11-gke.15 我

我想使用Socket.io将React本机应用程序连接到托管在Google云平台(GKE)上的Kubernetes集群内的服务器

Nginx入口控制器声明似乎有问题,但我找不到

我尝试添加
nginx.org/websocket服务
;重写我的后端代码,使其在端口3004上使用单独的NodeJS服务器(一个简单的HTTP服务器),然后通过入口控制器将其暴露在与端口3003不同的路径下;以及来自其他SO问题和Github问题的多个其他建议

可能有用的信息:

  • 集群主版本:
    1.15.11-gke.15
  • 我使用的负载平衡器由启用RBAC的Helm(
    stable/nginx-ingres
    )管理
  • 所有部署和服务都位于命名空间
    gitlab托管应用程序
  • 尝试连接到socket.io时收到的错误是:
    error:websocketerror
  • 对于前端部分,代码如下所示:

    App.js

    const socket=io('https://example.com/app-sockets/socketns', {
    对,,
    安全:是的,
    传输:['websocket','polling']
    });
    
    我希望上面的代码将我连接到一个名为
    socketdns
    的socket.io命名空间

    后端代码是:

    app.js

    const express=require('express');
    常量app=express();
    const server=require('http')。createServer(应用程序);
    const io=require('socket.io')(服务器);
    const redis=require('socket.io redis');
    io.set('transports',['websocket','polling']);
    io.适配器(redis({
    主机:process.env.NODE_env==='development'?'localhost':'redis cluster ip service.gitlab managed apps.svc.cluster.local',
    港口:6379
    }));
    on('error',function(err){console.log('Redis adapter!',err);});
    常量nsp=io.of('/socketns');
    nsp.on('连接'),功能(套接字){
    console.log('connected!');
    });
    服务器。听(3003,()=>{
    console.log('App监听3003');
    });
    
    入口服务是:

    入口服务.yaml

    apiVersion:extensions/v1beta1
    种类:入口
    元数据:
    注释:
    kubernetes.io/ingres.class:nginx
    nginx.ingres.kubernetes.io/rewrite-target://$1
    nginx.ingres.kubernetes.io/proxy-body-size:“100m”
    certmanager.k8s.io/cluster-issuer:letsencrypt产品
    nginx.ingres.kubernetes.io/proxy-connect-timeout:“7200”
    nginx.ingres.kubernetes.io/proxy-read-timeout:“7200”
    nginx.ingres.kubernetes.io/proxy-send-timeout:“7200”
    nginx.org/websocket-services:“应用程序套接字群集ip服务”
    名称:入口服务
    命名空间:gitlab托管的应用程序
    规格:
    tls:
    -主持人:
    -example.com
    秘书名称:letsencrypt产品
    规则:
    -主持人:example.com
    http:
    路径:
    -后端:
    serviceName:app cms群集ip服务
    服务端口:3000
    路径:/?(*)
    -后端:
    serviceName:应用程序用户群集ip服务
    服务端口:3001
    路径:/app-users/?(*)
    -后端:
    serviceName:应用程序套接字群集ip服务
    服务端口:3003
    路径:/app sockets/?(*)
    -后端:
    serviceName:应用程序套接字群集ip服务
    服务端口:3003
    路径:/app sockets/socketns/?(*)
    
    只需将注释更改为

    nginx.ingres.kubernetes.io/websocket-services:“应用程序套接字群集ip服务”
    
    而不是

    nginx.org/websocket-services:“应用程序套接字群集ip服务”
    

    大多数情况下,它会解决您的问题。

    您在哪里看到错误?后端日志?nginx入口控制器有两种主要风格
    nginx.org
    注释不是您正在使用的。您是否可以共享您的后端图像,或仅使用exmaple复制另一个图像?我已尝试解决一个非常类似的问题:到目前为止运气不佳。我认为这不是LB的问题,错误听起来好像正在到达后端。由于您的连接设置为安全,您是否在后端配置了证书?@Valentin Constanda这是否回答了您的问题?您仍然有这个问题吗?不幸的是,我使用的解决方案是使用节点端口公开部署,并使用IP地址连接到WebSocket。我知道这不是最好的解决办法,但这是我暂时同意的。