使用 Contour Kubernetes Ingress 处理 CORS

问题描述 投票:0回答:1

此时允许 CORS 请求的最佳方式是什么? (鉴于 Contour Ingress 中的 CORS 支持目前处于“停车场”)

我的特定用例是托管 GRPC 服务,该服务负责反向代理。方便的是,contour 还支持开箱即用的 grpc-web,我们希望将其用于我们的 Web 服务。

但是由于不支持CORS,所以无法进行跨域请求。

除了让我们的Web应用程序使用与GRPC api相同的域之外,还有其他解决方案可以满足我们目前的需求吗?

基本上,我们希望 Envoy 的配置与 GRPC Web 示例配置非常相似。

kubernetes contour kubernetes-ingress grpc-web
1个回答
1
投票

对于任何在尝试设置 Controur、gRPC 和 TLS 时偶然发现此问题的人;

您想使用

HTTPProxy
来代替。使用 TLS 的工作配置:

apiVersion: projectcontour.io/v1
kind: HTTPProxy
metadata:
  name: service-proxy 
spec:
  virtualhost:
    fqdn: service.example.com 
    corsPolicy:
      allowCredentials: true
      allowOrigin:
        - "*" 
      allowMethods:
        - GET
        - POST
        - OPTIONS
      allowHeaders:
        - authorization
        - cache-control
        - x-grpc-web
        - User-Agent
        - x-accept-content-transfer-encoding
        - x-accept-response-streaming
        - x-user-agent
        - x-grpc-web
        - grpc-timeout
        - Grpc-Message
        - Grpc-Status
        - content-type
    tls:
      secretName: service-secret
  routes:
    - conditions:
      - prefix: /
      services:
        - name: my-service
          port: 80
---
apiVersion: apps/v1
kind: Deployment metadata:
  labels:
    app: my-app
    run: my-service
  name: my-service
spec:
  replicas: 2
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
  selector:
    matchLabels:
      app: my-app
      run: my-service
  template:
    metadata:
      labels:
        app: my-app
        run: my-service
    spec:
      containers:
        - image: image:latest
          name: my-service
          resources: {}
          imagePullPolicy: Always
          readinessProbe:
            initialDelaySeconds: 10
            periodSeconds: 2
            httpGet:
              path: /health-check
              port: 3000
---
apiVersion: v1
kind: Service
metadata:
  name: my-service
  labels:
    app: my-app
    run: my-service
  annotations:
    projectcontour.io/upstream-protocol.h2c: "80"
spec:
  ports:
  - port: 80
    targetPort: 50051
    protocol: TCP
  selector:
    run: my-service

一些笔记

  1. 我对文档的理解是
    projectcontour.io/upstream-protocol.h2c
    实际上应该是
    projectcontour.io/upstream-protocol.h2
    ,但是这样做我在响应中收到
    TLS error: 268435703:SSL routines:OPENSSL_internal:WRONG_VERSION_NUMBER
    错误。此配置,带有
    h2c
    ,似乎有效并且实际上使用 TLS 来传输请求/响应数据。
  2. 我还没有仔细研究和整理
    allowHeadrs
    ,这只是一套现在对我有用的
    grpcurl
    以及使用 React 构建的 Web 应用程序前端,使用很棒的 nice-grpc-web 库。
  3. 强制 - 您不应在生产中使用“*”作为允许来源,因为这是一个安全问题 - 警告(真的...不要这样做)。
  4. TLS 秘密
    service-secret
    实际上是手动生成的,我还没有测试证书管理器的东西。
© www.soinside.com 2019 - 2024. All rights reserved.