Kubernetes Nginx Ingress and Socket.io Connection Issues Kubernetes Nginx Ingress and Socket.io Connection Issues kubernetes kubernetes

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']});