![Kubernetes Gateway API - 使用 HTTPRoute 规则重写 URI 路径](https://linux22.com/image/790029/Kubernetes%20Gateway%20API%20-%20%E4%BD%BF%E7%94%A8%20HTTPRoute%20%E8%A7%84%E5%88%99%E9%87%8D%E5%86%99%20URI%20%E8%B7%AF%E5%BE%84.png)
我的目标是拥有一个Gateway
可用于在不同路径上托管多个应用程序的单一过滤器。URLRewrite
但是,当过滤器似乎无法按预期工作时,它就存在了。
以 Cilium 的 Hubble 为例,我有以下资源:
apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:
name: hubble
namespace: kube-system
spec:
parentRefs:
- name: gateway
namespace: gateway-system
rules:
- matches:
- path:
type: PathPrefix
value: /hubble
filters:
- type: URLRewrite
urlRewrite:
path:
type: ReplacePrefixMatch
replacePrefixMatch: /
backendRefs:
- name: hubble-ui
port: 80
我想要导航到http://k8s-ingress/hubble
Hubble、http://k8s-ingress/argo-cd
Argo CD、http://k8s-ingress/foobar
Foobar 等等。
但是,当我应用此资源并导航到 时http://k8s-ingress/hubble
,我确实得到了响应,但这是一个空白页,而不是正常的 Hubble 仪表板。(但是,我可以判断服务器正在响应,因为浏览器选项卡名称设置为Hubble UI
。
如果我curl
这样做了,我确实会得到回应:
$> curl http://k8s-ingress/hubble
<!doctype html><html><head><meta charset="utf-8"/><title>Hubble UI</title><base href="/"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width,user-scalable=0,initial-scale=1,minimum-scale=1,maximum-scale=1"/><link rel="icon" type="image/png" sizes="32x32" href="favicon-32x32.png"/><link rel="icon" type="image/png" sizes="16x16" href="favicon-16x16.png"/><link rel="shortcut icon" href="favicon.ico"/><script defer="defer" src="bundle.main.104f057a7d45238d9d45.js"></script><link href="bundle.main.3818224e482785607640.css" rel="stylesheet"></head><body><div id="app"></div></body></html>%
我认为事情没有正常工作,因为我的服务器将我的请求视为目标,/hubble
而不是/
。这通常不会解析任何东西。但这不是重点吗URLRewrite/ReplacePrefixMatch
?在路由到服务器之前重写 URI 的路径?
也许我记错了,但 Istio 的工作原理不就是这样的吗?例如以下VirtualService
规范:
http:
- match:
- uri:
prefix: /hubble
route:
- destination:
host: hubble-ui
port:
number: 80
rewrite:
uri: /
我也尝试过使用URLRewrite/ReplaceFullPath
但结果却是与上述相同的行为。
- matches:
- path:
type: PathPrefix
value: /hubble
filters:
- type: URLRewrite
urlRewrite:
path:
type: ReplaceFullPath
replaceFullPath: /
backendRefs:
- name: hubble-ui
port: 80
RequestRedirect/ReplaceFullpath
有点用。因为我可以导航到http://k8s-ingress/hubble
并将浏览器 302 重定向到http://k8s-ingress
可以成功访问 Hubble UI 的位置。但这不是我想要的,因为我只能在 的网关上托管一个应用程序/
。
- matches:
- path:
type: PathPrefix
value: /hubble
filters:
- type: RequestRedirect
requestRedirect:
path:
type: ReplaceFullPath
replaceFullPath: /
statusCode: 302
- backendRefs:
- name: hubble-ui
port: 80