使用 Contour Kubernetes Ingress 处理 CORS

Han*_*der 5 contour kubernetes kubernetes-ingress grpc-web

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

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

但是,鉴于不支持 CORS,我们无法进行跨域请求。

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

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

fsb*_*023 1

对于任何在尝试设置 Contour、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
Run Code Online (Sandbox Code Playgroud)

一对夫妇的笔记

  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实际上是手动生成的,我还没有测试证书管理器的东西。