DAB-выражение linkerd не преобразуется, как ожидалось

У меня есть Linkerd, работающий локально на этой странице начала работы, и основной пример прокси работает. Мой вариант использования требует, чтобы я передавал веб-запросы одной из нескольких служб.NET WebApi, поэтому я создал небольшой пример локального проекта WebApi, который имеет два маршрута:

  1. localhost: 58371 возвращается hello world
  2. localhost:58371/api/values ["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 , Что я не понимаю?

Я прочитал несколько примеров преобразований dtab на сайте linkerd, и я поиграл с кучей разных конфигураций в моем файле yaml. Конечно, я просто упускаю что-то глупое, потому что это похоже на очень простой вариант использования.

1 ответ

Решение

По умолчанию linkerd использует значение заголовка HTTP Host, связанного с запросом, для маршрутизации трафика. В вашем примере вы устанавливаете Host: webпоэтому весь трафик направляется в "веб-службу", обнаруженную при обнаружении службы, независимо от пути URI запроса.

Так что вместо отправки вашего запроса localhost:4140/tacos, вы должны отправить его -H 'Host: tacos' localhost:4140/api/values, Вам также необходимо настроить ваш dtab следующим образом:

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

Это будет направлять весь трафик с Host: tacos к веб-сервису, найденному в сервисе обнаружения. Однако это просто конфигурация по умолчанию.

Если вы заинтересованы в маршрутизации на основе пути URI вместо заголовка HTTP Host, вы можете использовать идентификатор пути linkerd. Что-то вроде:

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 не выполняет произвольную перезапись пути HTTP URI на основе правил dtab. Поскольку это прокси-сервер, он ожидает прокси-запроса без изменений, за некоторыми исключениями (такими как consume опция по идентификатору пути). Вы всегда можете написать плагин linkerd, хотя он подойдет для вашего конкретного случая использования.

Другие вопросы по тегам