API Kubernetes Gateway — использование правил HTTPRoute для перезаписи путей URI
Моя цель — иметь одинGateway
который можно использовать для размещения нескольких приложений по разным путям. URLRewrite
Фильтр существует, однако, когда кажется, что он не работает должным образом.
Например, используя Cilium's 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/argo-cd
для доступа к компакт-диску Argo,http://k8s-ingress/foobar
для доступа к Foobar и т. д.
Однако когда я применяю этот ресурс и перехожу к , я получаю ответ, но это пустая страница, а не обычная панель управления Хаббла. (Однако я могу сказать, что сервер отвечает, поскольку имя вкладки браузера установлено на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
где я могу успешно попасть в пользовательский интерфейс Хаббла. Но это не то, чего я хочу, поскольку я смогу разместить на шлюзе только одно приложение по адресу:/
.
- matches:
- path:
type: PathPrefix
value: /hubble
filters:
- type: RequestRedirect
requestRedirect:
path:
type: ReplaceFullPath
replaceFullPath: /
statusCode: 302
- backendRefs:
- name: hubble-ui
port: 80