I'm setting up kubernetes cluster with node.js app. I have created all deployments, services and ingress and only thing that is not working are websockets. On app that I'm running locally I'm getting that request has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. When I tried to port forward myself to that pod, sockets started to work.
I tried adding the following to server side code:
let server = require('http').createServer(app, {origins: '*:*'});app.all('/', function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "X-Requested-With");
    next();
});const io = sio(server);
io.origins('*:*');My pod yaml file
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: app
  labels:
    name: app
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: app
    spec:
      containers:
        - name: app
          image: XXXXX:1.1
      restartPolicy: AlwaysService api yaml file
apiVersion: v1
kind: Service
metadata:
  labels:
    app: api-service
  name: api-service
spec:
  type: NodePort
  selector:
    app: app
  ports:
  - port: 8000
    targetPort: 8000
    name: apiService ws yaml file
apiVersion: v1
kind: Service
metadata:
  labels:
    app: ws-service
  name: ws-service
spec:
  type: NodePort
  selector:
    app: app
  ports:
  - port: 8001
    targetPort: 8001
    name: wsIngress yaml file
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: vhost-ingress
  annotations:
    kubernetes.io/ingress.global-static-ip-name: static-ip
    nginx.org/websocket-services: "ws-service"
spec:
  rules:
    - host: api.com
      http:
        paths:
          - backend:
              serviceName: app-service
              servicePort: 8000
    - host: ws.com
      http:
        paths:
          - backend:
              serviceName: ws-service
              servicePort: 8001As you can see, I have one deployment which has 2 ports exposed. On port 8000 is part of the code that handles API requests (api-service) and 8001 that should handle WS (ws-service). API part works perfectly and app is running without any errors. When trying to connect to ws.com I'm getting CORS error. The part which doesn't work are websockets.
Can you include
sessionAffinity: ClientIPin your service ws yaml and try?
Is not stated and the question is tagged as GCP but in case you're using Nginx ingress with a GCP Network Load Balancer:
Nginx-ingress has an specific annotation to allow CORS into the ingress, with different options:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: vhost-ingress
  annotations:
    kubernetes.io/ingress.global-static-ip-name: static-ip
    nginx.org/websocket-services: "ws-service"
    nginx.ingress.kubernetes.io/enable-cors: "true"
    nginx.ingress.kubernetes.io/cors-allow-methods: "PUT, GET, POST, OPTIONS"
    nginx.ingress.kubernetes.io/cors-allow-origin: "https://admin.example.com"
    nginx.ingress.kubernetes.io/cors-allow-credentials: "true"