express + socket.io + kubernetes Access-Control-Allow-Origin'标头

时间:2019-09-01 22:21:07

标签: node.js kubernetes google-cloud-platform

我正在使用node.js应用程序设置kubernetes集群。我已经创建了所有部署,服务和入口,并且只有无效的是websocket。在我在本地运行的应用程序上,我收到该请求已被CORS策略阻止:所请求的资源上没有“ Access-Control-Allow-Origin”标头。当我尝试将自己转发到该Pod时,套接字开始起作用。

我尝试在服务器端代码中添加以下内容:

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('*:*');

我的Pod Yaml文件

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: Always

服务api yaml文件

apiVersion: v1
kind: Service
metadata:
  labels:
    app: api-service
  name: api-service
spec:
  type: NodePort
  selector:
    app: app
  ports:
  - port: 8000
    targetPort: 8000
    name: api

服务ws yaml文件

apiVersion: v1
kind: Service
metadata:
  labels:
    app: ws-service
  name: ws-service
spec:
  type: NodePort
  selector:
    app: app
  ports:
  - port: 8001
    targetPort: 8001
    name: ws

入口Yaml文件

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: 8001

如您所见,我有一个部署,其中包含2个端口。在端口8000上,处理API请求(api-service)的代码的一部分,应处理WS(ws-service)的8001的代码的一部分。 API部分运行正常,应用程序正在运行,没有任何错误。尝试连接到ws.com时,出现CORS错误。无效的部分是websocket。

2 个答案:

答案 0 :(得分:1)

未说明,该问题被标记为/* this fixes a 100vw issue, removing the horizontal scrollbar when it's unneeded */ ,但如果您将Nginx入口与GCP Network Load Balancer一起使用:

Nginx-ingress具有一个特定的批注,以允许different options使用CORS进入入口:

GCP

答案 1 :(得分:0)

你可以包括

sessionAffinity: ClientIP

在您的服务中使用Yaml并尝试吗?