Kubernetes Gateway API - 使用 HTTPRoute 规则重写 URI 路径

Kubernetes Gateway API - 使用 HTTPRoute 规则重写 URI 路径

我的目标是拥有一个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/hubbleHubble、http://k8s-ingress/argo-cdArgo CD、http://k8s-ingress/foobarFoobar 等等。

但是,当我应用此资源并导航到 时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

相关内容