Anthos 服务 Mesh/Istio CORS 未启用
Anthos Service Mesh/Istio CORS not enabled
我正在尝试使用 Istio 入口网关在具有 Anthos Service Mesh 1.8 的 GKE 集群上启用 CORS,但 CORS header 未正确返回。
这里是服务配置
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: ClusterIP
selector:
app: my-service
ports:
- name: http
port: 8080
targetPort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-service
spec:
selector:
matchLabels:
app: my-service
template:
metadata:
labels:
app: my-service
spec:
serviceAccountName: ksa
containers:
- name: my-service
image: <my image>
ports:
- name: http-server
containerPort: 8080
和入口配置
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: istio-gateway
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: istio-ingress
spec:
hosts:
- "*"
gateways:
- istio-gateway
http:
- name: default-public-route
route:
- destination:
host: my-service
corsPolicy:
allowOrigins:
- exact: "*"
allowMethods:
- GET
- POST
- PATCH
- PUT
- DELETE
- OPTIONS
allowCredentials: false
allowHeaders:
- authorization
maxAge: "24h"
我也在使用 this 在线休息客户端来测试端点,如果我使用或不使用 http 前缀,我会得到不同的响应
使用 <ingress ip>/mypath
我得到 403 禁止错误,而使用 http://<ingress ip>/mypath
我得到一个通用 CORS 未启用。如果我从 Postman 执行 api 一切正常,但不会返回 CORS header。我也尝试直接从 Flask 应用程序设置 CORS,但没有任何改变。
知道如何解决吗?
谢谢
这应该可以,我刚刚测试过。
allowOrigins:
- exact: "*"
根据我的经验,Istio CORS 选项是通用 CORS 功能的一个相当薄的包装,所以我想真正的问题不在于 Istio,而是 CORS 配置。
可能 allowCredentials
或 allowHeaders
有问题。此外,如果您有 Istio AuthorizationPolicy
,应该允许 HTTP OPTIONS
调用进行飞行前请求。
我正在尝试使用 Istio 入口网关在具有 Anthos Service Mesh 1.8 的 GKE 集群上启用 CORS,但 CORS header 未正确返回。
这里是服务配置
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: ClusterIP
selector:
app: my-service
ports:
- name: http
port: 8080
targetPort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-service
spec:
selector:
matchLabels:
app: my-service
template:
metadata:
labels:
app: my-service
spec:
serviceAccountName: ksa
containers:
- name: my-service
image: <my image>
ports:
- name: http-server
containerPort: 8080
和入口配置
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: istio-gateway
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: istio-ingress
spec:
hosts:
- "*"
gateways:
- istio-gateway
http:
- name: default-public-route
route:
- destination:
host: my-service
corsPolicy:
allowOrigins:
- exact: "*"
allowMethods:
- GET
- POST
- PATCH
- PUT
- DELETE
- OPTIONS
allowCredentials: false
allowHeaders:
- authorization
maxAge: "24h"
我也在使用 this 在线休息客户端来测试端点,如果我使用或不使用 http 前缀,我会得到不同的响应
使用 <ingress ip>/mypath
我得到 403 禁止错误,而使用 http://<ingress ip>/mypath
我得到一个通用 CORS 未启用。如果我从 Postman 执行 api 一切正常,但不会返回 CORS header。我也尝试直接从 Flask 应用程序设置 CORS,但没有任何改变。
知道如何解决吗?
谢谢
这应该可以,我刚刚测试过。
allowOrigins:
- exact: "*"
根据我的经验,Istio CORS 选项是通用 CORS 功能的一个相当薄的包装,所以我想真正的问题不在于 Istio,而是 CORS 配置。
可能 allowCredentials
或 allowHeaders
有问题。此外,如果您有 Istio AuthorizationPolicy
,应该允许 HTTP OPTIONS
调用进行飞行前请求。