DAB-выражение linkerd не преобразуется, как ожидалось
У меня есть Linkerd, работающий локально на этой странице начала работы, и основной пример прокси работает. Мой вариант использования требует, чтобы я передавал веб-запросы одной из нескольких служб.NET WebApi, поэтому я создал небольшой пример локального проекта WebApi, который имеет два маршрута:
- localhost: 58371 возвращается
hello world
- 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, хотя он подойдет для вашего конкретного случая использования.