我们正在利用 Kubernetes Gateway API 的强大功能,在 Gateway 和 HTTPRoute 中使用它的功能。
我们有一个使用 GKE 外部全局负载均衡器的简单网关资源。下面显示了完整的清单代码
kind: Gateway
apiVersion: gateway.networking.k8s.io/v1beta1
metadata:
name: external-http
namespace: infra-ns
spec:
gatewayClassName: gke-l7-global-external-managed
listeners:
- name: https
protocol: HTTPS
port: 443
allowedRoutes:
namespaces:
from: Selector
selector:
matchLabels:
shared-gateway-access: "true"
tls:
mode: Terminate
options:
networking.gke.io/pre-shared-certs: ipos-cert
addresses:
- type: NamedAddress
value: "l7lb-external-ip-address"
这个网关像这样附加到多个 HTTPRoutes
rules:
- matches:
- path:
value: /api/v1/service
backendRefs:
- name: example-service
port: 80
当请求从代码应用程序客户端发送时,该设置运行良好。问题是,如果请求是通过浏览器发送的,我们会得到一个
Cross-Origin Resource Sharing error: PreflightMissingAllowOriginHeader
并且请求状态显示 CORS error
我们如何使用
Kubernetes Gateway API
添加缺少的允许来源标头
GKE 网关路线图上包含 CORS 支持,但目前您需要从应用程序后端添加支持。
我想补充一下我如何解决这个问题的观点,因为 Gari Singh 说你必须在应用程序级别执行此操作,我确实这样做了,并且我尝试了很多实现,但没有成功,只是当我看到 GKE 集群日志时偶然发现的GKE gatewayAPI 默认实现的运行状况检查存在问题,我必须将我的服务配置为发送 200 ok 状态作为对 /GET 请求的响应,您可以在官方文档gatewayAPI Restrictions and Limitations 中看到这一点,我们感兴趣的部分是
GKE Gateway 的行为与 Ingress 不同,因为 Gateway 不会推断运行状况检查参数。如果您的服务未针对 GET / 请求返回 200,或者您有其他已调整的 Pod 准备情况检查,则需要为您的服务配置 HealthCheckPolicy。
所以我希望这可以为那些可能不是像我这样的专家的人节省时间。