【问题标题】:express + socket.io + kubernetes Access-Control-Allow-Origin' headerexpress + socket.io + kubernetes Access-Control-Allow-Origin' 标头
【发布时间】:2020-01-05 01:45:55
【问题描述】:

我正在使用 node.js 应用程序设置 kubernetes 集群。我已经创建了所有部署、服务和入口,唯一不工作的是 websockets。在我在本地运行的应用程序上,我收到该请求已被 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) 的代码的一部分,而 8001 是应该处理 WS (ws-service) 的代码的一部分。 API 部分运行良好,应用程序运行正常,没有任何错误。尝试连接到 ws.com 时出现 CORS 错误。不起作用的部分是 websockets。

【问题讨论】:

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


    【解决方案1】:

    你可以加入

    sessionAffinity: ClientIP
    

    在您的服务中使用 ws yaml 并尝试?

    【讨论】:

    • 这没有帮助
    【解决方案2】:

    没有说明,问题被标记为GCP,但如果您使用带有 GCP 的 Nginx 入口 Network Load Balancer

    Nginx-ingress 有一个特定的注解允许 CORS 进入 ingress,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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-11
      • 1970-01-01
      • 2019-02-07
      • 2021-03-07
      • 2018-10-28
      • 2016-01-21
      • 2018-07-18
      • 2019-03-18
      相关资源
      最近更新 更多