Kubernetes Nginx Ingress and Socket.io Connection Issues
Socket.io has a specific path it uses for websocket communication. Due to this, the kubernetes ingress needs to be configured to support "/socket.io". Additionally, the node.js middleware also needs to have custom namespace for the socket endpoint.
ingress-ws-service.yaml
apiVersion: extensions/v1beta1kind: Ingressmetadata: name: ingress-ws-service annotations: nginx.ingress.kubernetes.io/use-regex: "true" nginx.org/websocket-services: "websockettest-cluster-ip-service"spec: rules: - http: paths: - path: /websockettest/.* backend: serviceName: websockettest-cluster-ip-service servicePort: 3020 - path: /socket.io/.* backend: serviceName: websockettest-cluster-ip-service servicePort: 3020
Nodejs Socket.io
const http = require('http');const express = require('express');var app = express();var server = http.createServer(app);var io = require('socket.io')(server);const nsp = io.of("/websockettest");nsp.on('connection', function (socket) { console.log('connected socket!'); socket.on('greet', function (data) { console.log(data); nsp.emit('respond', { hello: 'Hello' }); }); socket.on('disconnect', function () { console.log('Socket disconnected'); });});const port = process.env.PORT || 3020;server.listen(port, () => { console.log(`Server is up on port ${port}`);});
React Client
const socket = io('/websockettest', { 'reconnection': true, transports: ['websocket']});