linkerd Dtab 表达式未按预期转换
linkerd Dtab expression not transforming as expected
我有 linkerd running locally per this getting started page,基本代理示例有效。我的用例要求我将 Web 请求代理到几个 .NET WebApi 服务之一,所以我在本地制作了一个小示例 WebApi 项目 运行,它有两条路线:
- localhost:58371 returns
hello world
- localhost:58371/api/values returns
["value1", "value2"]
具有匹配路线的映射请求
如果我保留我的 linkerd.yaml
文件,就像开箱即用:
routers:
- protocol: http
dtab: |
/svc => /#/io.l5d.fs
然后映射路由直接工作:
curl -H "Host: web" http://localhost:4140/
--> hello world
curl -H "Host: web" http://localhost:4140/api/values
--> ["value1", "value2"]
映射不匹配的路线
现在,我想映射 localhost:4140/tacos
--> localhost:58371/api/values
。因此,我将 .yaml 文件更新为:
routers:
- protocol: http
dtab: |
/svc => /#/io.l5d.fs;
/tacos => /api/values;
并重启 linkerd。
但是,http://localhost:4140/
似乎总是解析为 http://localhost:58371/tacos
,而不是 http://localhost:58371/api/values
。我有什么不明白的?
我在 linkerd 的站点上阅读了一堆示例 dtab 转换,并且在我的 yaml 文件中尝试了一堆不同的配置。当然,这只是我遗漏的一些愚蠢的东西,因为这似乎是一个非常简单的用例。
默认情况下,linkerd 使用与请求关联的 HTTP 主机 header 的值来路由流量。在您的示例中,您正在设置 Host: web
,因此所有流量都将流向在服务发现中找到的 "web" 服务,而不管请求 URI 的路径如何。
因此,与其将您的请求发送至 localhost:4140/tacos
,不如将其发送至 -H 'Host: tacos' localhost:4140/api/values
。您还需要按如下方式调整您的 dtab:
/svc => /#/io.l5d.fs;
/svc/tacos => /svc/web;
这会将所有具有 Host: tacos
的流量路由到在服务发现中找到的 "web" 服务。然而,这只是默认配置。
如果您对基于 URI 路径而不是 HTTP 主机的路由感兴趣 header,您可以使用 linkerd 的 path identifier。类似于:
routers:
- protocol: http
identifier:
kind: io.l5d.path
segments: 1
dtab: |
/svc => /#/io.l5d.fs;
使用该配置,对 localhost:4140/api/values
的请求将被路由到服务发现中的 "api" 服务,而对 localhost:4140/tacos
的请求将被路由到 "tacos" 服务,并且可以通过修改您的 dtab 来更改这两个路由决策。
我应该注意,linkerd 不会根据 dtab 规则进行任意 HTTP URI 路径重写。由于它是一个代理,它希望在不修改的情况下代理请求,但有一些例外(例如路径标识符上的 consume
选项)。你总是可以写一个 linkerd plugin 虽然这将适合你的特定用例。
我有 linkerd running locally per this getting started page,基本代理示例有效。我的用例要求我将 Web 请求代理到几个 .NET WebApi 服务之一,所以我在本地制作了一个小示例 WebApi 项目 运行,它有两条路线:
- localhost:58371 returns
hello world
- localhost:58371/api/values returns
["value1", "value2"]
具有匹配路线的映射请求
如果我保留我的 linkerd.yaml
文件,就像开箱即用:
routers:
- protocol: http
dtab: |
/svc => /#/io.l5d.fs
然后映射路由直接工作:
curl -H "Host: web" http://localhost:4140/
--> hello world
curl -H "Host: web" http://localhost:4140/api/values
--> ["value1", "value2"]
映射不匹配的路线
现在,我想映射 localhost:4140/tacos
--> localhost:58371/api/values
。因此,我将 .yaml 文件更新为:
routers:
- protocol: http
dtab: |
/svc => /#/io.l5d.fs;
/tacos => /api/values;
并重启 linkerd。
但是,http://localhost:4140/
似乎总是解析为 http://localhost:58371/tacos
,而不是 http://localhost:58371/api/values
。我有什么不明白的?
我在 linkerd 的站点上阅读了一堆示例 dtab 转换,并且在我的 yaml 文件中尝试了一堆不同的配置。当然,这只是我遗漏的一些愚蠢的东西,因为这似乎是一个非常简单的用例。
默认情况下,linkerd 使用与请求关联的 HTTP 主机 header 的值来路由流量。在您的示例中,您正在设置 Host: web
,因此所有流量都将流向在服务发现中找到的 "web" 服务,而不管请求 URI 的路径如何。
因此,与其将您的请求发送至 localhost:4140/tacos
,不如将其发送至 -H 'Host: tacos' localhost:4140/api/values
。您还需要按如下方式调整您的 dtab:
/svc => /#/io.l5d.fs;
/svc/tacos => /svc/web;
这会将所有具有 Host: tacos
的流量路由到在服务发现中找到的 "web" 服务。然而,这只是默认配置。
如果您对基于 URI 路径而不是 HTTP 主机的路由感兴趣 header,您可以使用 linkerd 的 path identifier。类似于:
routers:
- protocol: http
identifier:
kind: io.l5d.path
segments: 1
dtab: |
/svc => /#/io.l5d.fs;
使用该配置,对 localhost:4140/api/values
的请求将被路由到服务发现中的 "api" 服务,而对 localhost:4140/tacos
的请求将被路由到 "tacos" 服务,并且可以通过修改您的 dtab 来更改这两个路由决策。
我应该注意,linkerd 不会根据 dtab 规则进行任意 HTTP URI 路径重写。由于它是一个代理,它希望在不修改的情况下代理请求,但有一些例外(例如路径标识符上的 consume
选项)。你总是可以写一个 linkerd plugin 虽然这将适合你的特定用例。