linkerd Dtab表达式未按预期转换

时间:2017-06-12 13:35:56

标签: linkerd

我已linkerdthis getting started page本地运行,基本代理示例有效。我的用例要求我将Web请求代理到几个.NET WebApi服务之一,所以我在本地运行了一个带有两个路径的示例WebApi项目:

  1. localhost:58371返回hello world
  2. localhost:58371 / api / values返回["value1", "value2"]
  3. 使用匹配路由映射请求

    如果我将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。我不明白的是什么?

    我已经在链接器网站上阅读了一堆示例dtab转换,并且我在yaml文件中使用了大量不同的配置。当然,我错过了一些愚蠢的东西,因为这似乎是一个非常简单的用例。

1 个答案:

答案 0 :(得分:1)

默认情况下,linkerd使用与请求关联的HTTP Host标头的值来路由流量。在您的示例中,您正在设置Host: web,因此无论请求URI的路径如何,所有流量都将转到服务发现中的“Web”服务。

因此,您应将其发送至localhost:4140/tacos,而不是将您的请求发送至-H 'Host: tacos' localhost:4140/api/values。您还需要按如下方式调整dtab:

/svc       => /#/io.l5d.fs;
/svc/tacos => /svc/web;

这将使用Host: tacos将所有流量路由到服务发现中的“Web”服务。但这只是默认配置。

如果您对基于URI路径而非HTTP主机头的路由感兴趣,可以使用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,但这符合您的特定用例。