linkerd Dtab 表达式未按预期转换

linkerd Dtab expression not transforming as expected

我有 linkerd running locally per this getting started page,基本代理示例有效。我的用例要求我将 Web 请求代理到几个 .NET WebApi 服务之一,所以我在本地制作了一个小示例 WebApi 项目 运行,它有两条路线:

  1. localhost:58371 returns hello world
  2. 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 虽然这将适合你的特定用例。