Проблемы маршрутизации на основе пути Traefik как Ingress Controller

Я бегу через то, что выглядит как проблема конфигурации! Я использую traefik в качестве входного контроллера в kubernetes, и у меня есть вход для маршрутизации некоторых URL-адресов для маршрутизации некоторых веб-интерфейсов к различным бэкэндам. Допустим, у меня есть что-то вроде этого:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test
  annotations:
    kubernetes.io/ingress.class: traefik
    traefik.frontend.rule.type: ReplacePathRegex
spec:
  rules:
  - host: foo.io
    http:
      paths:
      - path: /api/authservice/(.*) /$1
        backend:
          serviceName: auth
          servicePort: 8901
      - path: /api/svcXXX/v1/files/cover/(.*) /v1/files/cover/$1
        backend:
          serviceName: files
          servicePort: 8183
      - path: /api/svcXXX/v1/files/image/(.*) /v1/files/image/$1
        backend:
          serviceName: files
          servicePort: 8183

Использование Postman (или любого другого клиента), если я отправлю запрос на http://foo.io/api/authservice/auth/oauth/token, глядя в журналы доступа, кажется, что он направляется к http://foo.io/api/svcXXX/v1/files/image/(.*) /v1/files/image/$1, Я вижу это в журналах доступа:

[03/Jul/2018:12:57:17 +0000] "POST /api/authservice/auth/oauth/token HTTP/1.1" 401 102 "-" "PostmanRuntime/7.1.5" 15 "foo.io/api/svcXXX/v1/files/image/(.*) /v1/files/image/$1" 37ms

Я делаю что-то неправильно?

1 ответ

Решение

ReplacePathRegex является правилом модификатора. Согласно документации:

Правила-модификаторы только изменяют запрос. Они не оказывают никакого влияния на принимаемые решения о маршрутизации.

Ниже приведен список существующих правил модификаторов:

  • AddPrefix: /products: Добавить префикс пути к существующему пути запроса до пересылки запроса в серверную часть.
  • ReplacePath: /serverless-path: Заменяет путь и добавляет старый путь в заголовок X-Replaced-Path. Полезно для сопоставления с функциями AWS Lambda или Google Cloud.
  • ReplacePathRegex: ^/api/v2/(.*) /api/$1: Заменяет путь регулярным выражением и добавляет старый путь в заголовок X-Replaced-Path. Разделите регулярное выражение и замену пробелом.

Для маршрутизации запросов вы должны использовать соответствия:

Правила соответствия определяют, должен ли конкретный запрос быть передан бэкэнду.

Разделите несколько значений правила, (запятая), чтобы включить ЛЮБУЮ семантику (т. Е. Переслать запрос, если какое-либо правило соответствует). Не работает для Headers и HeadersRegexp.

Разделите несколько значений правил по; (точка с запятой), чтобы включить ВСЕ семантику (т. е. переслать запрос, если все правила совпадают).

Рекомендации по использованию Path Matcher

В этом разделе объясняется, когда использовать различные средства сопоставления путей.

использование Path если ваш сервер слушает только точный путь. Например, Path: /products будет соответствовать /products но нет /products/shoes,

Использовать *Prefix* matcher, если ваш бэкэнд прослушивает определенный базовый путь, но также обслуживает запросы по подпутям. Например, PathPrefix: /products будет соответствовать /products но также /products/shoes а также /products/shirts, Поскольку путь пересылается как есть, ожидается, что ваш бэкэнд будет прослушивать /products.

Использовать *Strip matcher, если ваш бэкэнд прослушивает корневой путь (/), но должен маршрутизироваться с определенным префиксом. Например, PathPrefixStrip: /products будет соответствовать /products но также /products/shoes а также /products/shirts, Поскольку путь перед пересылкой удаляется, ожидается, что ваш бэкэнд прослушивает /, Если ваш бэкэнд обслуживает ресурсы (например, изображения или файлы Javascript), скорее всего, он должен возвращать правильно сконструированные относительные URL-адреса. Продолжая пример, сервер должен вернуть /products/shoes/image.png (и не /images.png который Traefik, скорее всего, не сможет связать с одним и тем же бэкэндом). X-Forwarded-Prefix header (доступен начиная с Traefik 1.3) может быть запрошен для динамического создания таких URL.

Вместо того, чтобы различать свои бэкэнды только по пути, вы можете добавить в микс Host matcher. Таким образом, пространство имен ваших бэкэндов происходит на основе хостов в дополнение к путям.

Полный список участников и их описания можно найти здесь

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