【发布时间】:2022-10-24 20:56:08
【问题描述】:
我在 GKE 中运行一个入口。我将大部分流量路由到一个后端,但我希望将一些呼叫路由到另一个后端。入口看起来像这样:
---
apiVersion: networking.k8s.io/v1
kind: Ingress
spec:
rules:
- http:
paths:
- backend:
service:
name: zone-search
port:
name: external
path: /api/v2/zones/location-search
pathType: Prefix
- http:
paths:
- backend:
service:
name: api-service
port:
name: external
path: /*
pathType: ImplementationSpecific
如果我提出GET /api/v2/zones/location-search 之类的请求,它可以正常工作。
但是,如果我执行GET /api/v2/zones/location-search?foo=bar,我的请求最终会出现在 api-service 后端,而不是我预期的区域搜索。
我尝试过使用pathType: ImplementationSpecific 并同时使用path: /api/v2/zones/location-search 和path: /api/v2/zones/location-search/*,但仍然没有进展。 Google 要求通配符跟在斜杠后面,但 location-search 是端点本身,后面没有斜杠。
我还尝试使用具有相同结果的默认后端。问题似乎仍然是包含?foo=bar 的url 与我指定的路径不匹配。
我不能这样做path: /api/v2/zones/*,因为 api 中有其他端点会进入不应该的区域搜索后端。
更新
我尝试使用双引号,并删除第二个
- http:
paths:
并开始收到failed_to_pick_backend 错误。它最终通过更改后端服务的健康检查来解决。
我不知道健康检查问题是否意味着当区域搜索服务不健康时选择了 api 服务作为备份,或者我的两个更改之一是否解决了我最初的问题。
【问题讨论】:
-
它绝对应该像您预期的那样工作。我会查看是否有任何其他 Ingress 影响(可能是旧版本)。还可以尝试在路径中使用双引号。
标签: google-cloud-platform google-kubernetes-engine kubernetes-ingress