gpt4 book ai didi

使用 Socket.io、ExpressJS 和 Nginx Ingress 的 Kubernetes Websockets

转载 作者:行者123 更新时间:2023-12-02 11:33:27 26 4
gpt4 key购买 nike

我想使用 Socket.io 将 React Native 应用程序连接到托管在 Google Cloud Platform (GKE) 上的 Kubernetes 集群内的服务器。
Nginx 入口 Controller 声明似乎存在问题,但我找不到它。
我试过添加 nginx.org/websocket-services ;重写我的后端代码,使其在端口 3004 上使用单独的 NodeJS 服务器(一个简单的 HTTP 服务器),然后通过入口 Controller 将其暴露在与端口 3003 不同的路径下;以及来自其他 SO 问题和 Github 问题的多项其他建议。
可能有用的信息:

  • 集群主版本:1.15.11-gke.15
  • 我使用由 Helm ( stable/nginx-ingress ) 管理的负载均衡器,并启用了 RBAC
  • 所有部署和服务都在命名空间 gitlab-managed-apps
  • 尝试连接到 socket.io 时收到的错误是:Error: websocket error

  • 对于前端部分,代码如下: App.js
    const socket = io('https://example.com/app-sockets/socketns', {
    reconnect: true,
    secure: true,
    transports: ['websocket', 'polling']
    });
    我希望上述内容将我连接到名为 socketdns 的 socket.io 命名空间.
    后台代码为: app.js
    const express = require('express');
    const app = express();
    const server = require('http').createServer(app);
    const io = require('socket.io')(server);
    const redis = require('socket.io-redis');

    io.set('transports', ['websocket', 'polling']);
    io.adapter(redis({
    host: process.env.NODE_ENV === 'development' ? 'localhost' : 'redis-cluster-ip-service.gitlab-managed-apps.svc.cluster.local',
    port: 6379
    }));
    io.of('/').adapter.on('error', function(err) { console.log('Redis Adapter error! ', err); });

    const nsp = io.of('/socketns');

    nsp.on('connection', function(socket) {
    console.log('connected!');
    });

    server.listen(3003, () => {
    console.log('App listening to 3003');
    });
    入口服务是: ingress-service.yaml
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
    annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /$1
    nginx.ingress.kubernetes.io/proxy-body-size: "100m"
    certmanager.k8s.io/cluster-issuer: letsencrypt-prod
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "7200"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "7200"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "7200"
    nginx.org/websocket-services: "app-sockets-cluster-ip-service"
    name: ingress-service
    namespace: gitlab-managed-apps
    spec:
    tls:
    - hosts:
    - example.com
    secretName: letsencrypt-prod
    rules:
    - host: example.com
    http:
    paths:
    - backend:
    serviceName: app-cms-cluster-ip-service
    servicePort: 3000
    path: /?(.*)
    - backend:
    serviceName: app-users-cluster-ip-service
    servicePort: 3001
    path: /app-users/?(.*)
    - backend:
    serviceName: app-sockets-cluster-ip-service
    servicePort: 3003
    path: /app-sockets/?(.*)
    - backend:
    serviceName: app-sockets-cluster-ip-service
    servicePort: 3003
    path: /app-sockets/socketns/?(.*)

    最佳答案

    只需将注释更改为

    nginx.ingress.kubernetes.io/websocket-services: "app-sockets-cluster-ip-service"
    代替
    nginx.org/websocket-services: "app-sockets-cluster-ip-service" 
    大多数情况下,它会解决您的问题。

    关于使用 Socket.io、ExpressJS 和 Nginx Ingress 的 Kubernetes Websockets,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63001955/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com