I'm trying to get a simple websocket connection working on my server running in a Kubernetes cluster.
Websocket connections are able to establish on my local test machine but I can't connect my client side to the server after I deploy to GKE with nginx-ingress.
ingress yaml file:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-service
annotations:
kubernetes.io/ingress.class: nginx
nginx.org/websocket-services : "socket-cluster-ip-service"
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/websocket-services : "socket-cluster-ip-service"
nginx.ingress.kubernetes.io/proxy-send-timeout: "1800"
nginx.ingress.kubernetes.io/proxy-read-timeout: "1800"
spec:
rules:
- host: my-socket.com
http:
paths:
- path: /
backend:
serviceName: socket-cluster-ip-service
servicePort: 3000
- host: www.my-socket.com
http:
paths:
- path: /
backend:
serviceName: socket-cluster-ip-service
servicePort: 3000
service yaml file:
apiVersion: v1
kind: Service
metadata:
name: socket-cluster-ip-service
spec:
type: ClusterIP
selector:
component: socket
ports:
- port: 3000
targetPort: 3000
deployment yaml file:
apiVersion: apps/v1
kind: Deployment
metadata:
name: socket-deployment
spec:
replicas: 1
selector:
matchLabels:
component: socket
template:
metadata:
labels:
component: socket
spec:
containers:
- name: socket
image: gcr.io/my-socket/socket
ports:
- containerPort: 3000
express server code:
...
var server = http.createServer(app);
const WebSocket = require('ws');
const wss = new WebSocket.Server({ server: server });
wss.on('connection', function connection(ws) {
console.log("new connection", ws)
ws.on('message', function incoming(message) {
console.log('received: %s', message);
});
ws.send('something');
});
...
client side code:
var ws = new WebSocket('ws://www.my-socket.com/');
ws.onopen = () => {
// connection opened
ws.send('something'); // send a message
};
ws.onmessage = (e) => {
// a message was received
console.log(e.data);
};
ws.onerror = (e) => {
// an error occurred
console.log(e.message);
};
ws.onclose = (e) => {
// connection closed
console.log(e.code, e.reason);
};
I keep getting the error message "Invalid Sec-WebSocket-Accept response" from the client side. But I think it's just the fact that the client could not establish websocket connection with the server.
The server side library I used is ws
I've added the following annotations to my ingress yaml file as suggested by other post and official ingress-nginx documentation but it's still not working:
nginx.org/websocket-services : "socket-cluster-ip-service"
nginx.ingress.kubernetes.io/websocket-services : "socket-cluster-ip-service"
nginx.ingress.kubernetes.io/proxy-send-timeout: "1800"
nginx.ingress.kubernetes.io/proxy-read-timeout: "1800"