此时允许 CORS 请求的最佳方式是什么? (鉴于 Contour Ingress 中的 CORS 支持目前处于“停车场”)
我的特定用例是托管 GRPC 服务,该服务负责反向代理。方便的是,contour 还支持开箱即用的 grpc-web,我们希望将其用于我们的 Web 服务。
但是由于不支持CORS,所以无法进行跨域请求。
除了让我们的Web应用程序使用与GRPC api相同的域之外,还有其他解决方案可以满足我们目前的需求吗?
基本上,我们希望 Envoy 的配置与 GRPC Web 示例配置非常相似。
对于任何在尝试设置 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
projectcontour.io/upstream-protocol.h2c
实际上应该是 projectcontour.io/upstream-protocol.h2
,但是这样做我在响应中收到 TLS error: 268435703:SSL routines:OPENSSL_internal:WRONG_VERSION_NUMBER
错误。此配置,带有 h2c
,似乎有效并且实际上使用 TLS 来传输请求/响应数据。allowHeadrs
,这只是一套现在对我有用的 grpcurl
以及使用 React 构建的 Web 应用程序前端,使用很棒的 nice-grpc-web 库。service-secret
实际上是手动生成的,我还没有测试证书管理器的东西。