Я хотел бы выполнить динамическую маршрутизацию на основе путей к сервисам Kubernetes с поддержкой WebSockets.
Например, этот путь:
http://10.0.0.1/myport/myservice/foo
должен направлять трафик в службу myservice на именованный порт myport (пространство имен по умолчанию) с путем foo.
Я был близок к достижению этого с помощью Linkerd, используя следующую запись маршрутизатора ConfiMap (с использованием namer io.l5d.k8s):
routers:
- protocol: http
dtab: |
/svc => /#/io.l5d.k8s/default;
identifier:
kind: io.l5d.path
segments: 2
consume: true
Это сработало, за исключением того, что мне нужна поддержка WebSocket, которая недоступна в Linkerd.
Я пробовал NGINX с использованием регулярных выражений для определения местоположения и правил перезаписи. Это выглядит примерно так:
location ~ ^/(.*?)/.*$ {
rewrite ^/(.*?)/(.*)$ /$2 break;
proxy_pass http://$upstream:$1;
Это сработало, за исключением того, что NGINX не выполняет маршрутизацию к службам, созданным после запуска NGINX. Я не уверен, связано ли это с проблемами кеширования DNS в nginx или с поддержкой записей SRV DNS. Этот сценарий должен работать в NGINX Plus, но я должен полагаться в программном обеспечении с открытым исходным кодом только.
Есть идеи, какие обратные прокси / сервисная сетка поддерживает динамическую маршрутизацию к сервису K8s: порт, а также WebSockets?
Изменить. Можно ли это сделать с помощью Istio? Похоже, что нужно указать жестко запрограммированное место назначения в Конфигурация маршрутизации Istio. Я могу указать регулярное выражение в источнике (запросе), но не могу использовать группы захвата регулярных выражений для указания места назначения.