我想对支持 WebSocket 的 Kubernetes 服务执行基于路径的动态路由。
例如,这条路径:
http://10.0.0.1/myport/myservice/foo
应该使用路径foo将流量路由到命名端口myport(默认命名空间)上的服务myservice。
我使用以下 ConfiMap 路由器条目(使用 io.l5d.k8s 命名器)通过 Linkerd接近实现了这一点:
routers:
- protocol: http
dtab: |
/svc => /#/io.l5d.k8s/default;
identifier:
kind: io.l5d.path
segments: 2
consume: true
除了我需要在 Linkerd 中不可用的 WebSocket 支持之外,它可以工作。
我尝试使用正则表达式来定位NGINX并重写规则。这看起来像这样:
location ~ ^/(.*?)/.*$ {
rewrite ^/(.*?)/(.*)$ /$2 break;
proxy_pass http://$upstream:$1;
除了 NGINX 不会路由到 NGINX 启动后创建的服务之外,这很有效。我不确定这是否与 nginx 中的 DNS 缓存问题或对SRV DNS 记录的支持有关。这种情况应该在NGINX Plus中工作,但我必须只依赖开源软件。
反向代理/服务网格支持动态路由到 K8s service:port 以及 WebSockets 的任何想法?
编辑 这可以用Istio完成吗?似乎必须在Istio 路由配置中指定一个硬编码的目的地。我可以在源(请求)上指定一个正则表达式,但不能使用正则表达式捕获组来指定目标。