Маршрутизация на основе пути Traefik во входе kubernetes не работает должным образом
Я пытаюсь использовать механизм маршрутизации на основе пути, предоставленный входным контроллером Traefik в Кубернетесе, но у меня есть некоторые проблемы с переписыванием URL.
Моя [ОБНОВЛЕННАЯ] конфигурация следующая
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: traefik
traefik.ingress.kubernetes.io/auth-type: "basic"
traefik.ingress.kubernetes.io/auth-tls-insecure: "true"
traefik.ingress.kubernetes.io/frontend-entry-points: "http,https"
traefik.ingress.kubernetes.io/app-root: "/"
traefik.ingress.kubernetes.io/rule-type: "PathPrefixStrip"
traefik.ingress.kubernetes.io/rewrite-target: "/"
name: webapp-ingress
namespace: my-company
spec:
rules:
- host: local-ubuntu
- http:
paths:
- path: /
backend:
serviceName: webapp
servicePort: 80
- path: /db
backend:
serviceName: db-manager
servicePort: 8081
Трафик направляется на нужные сервисы, но URL все еще префиксируется / db, когда я просматриваю журнал для службы db-manager (kubernetes). Что я ожидал с PathPrefixStrip, так это то, что трафик будет направляться без префикса / db к контейнеру, на котором выполняется микросервис db-manager, который прослушивает / ( http://db-manager:8081/) на серверной части. боковая сторона.
Я что-то пропустил? Это поддерживается traefik или только nginx? Заранее спасибо за ваш отзыв.
[РЕДАКТИРОВАТЬ]
Чтобы быть более конкретным, я наблюдаю следующее с текущими аннотациями, обсуждаемыми ниже
- traefik.ingress.kubernetes.io/rule-type: "PathPrefixStrip"
- traefik.ingress.kubernetes.io/rewrite-target: "/"
URL: http://local-ubuntu/db [OK] -> 200
Тогда другие ресурсы загружаются, но указывают на неправильный базовый URL
Пример:
URL ресурса: http://local-ubuntu/public/css/bootstrap.min.css
Но это должно быть: http://local-ubuntu/db/public/css/bootstrap.min.css(который работает, когда я попробовал вручную)
Я не уверен, что мне не хватает здесь в текущей конфигурации.
4 ответа
Относительно статического содержимого, которое не обслуживается, в документации говорится следующее:
Используйте *Strip matcher, если ваш бэкэнд прослушивает корневой путь (/), но должен маршрутизироваться по определенному префиксу. Например, PathPrefixStrip: / products будет соответствовать / products, а также / products / shoes и / products / shirts. Поскольку путь перед пересылкой удаляется, ожидается, что ваш бэкэнд будет прослушивать /. Если ваш бэкэнд обслуживает ресурсы (например, изображения или файлы Javascript), скорее всего, он должен возвращать правильно сконструированные относительные URL-адреса. Продолжая этот пример, бэкэнд должен возвращать /products/shoes/image.png (а не /images.png, который Traefik, скорее всего, не сможет связать с тем же бэкендом). Заголовок X-Forwarded-Prefix (доступный с Traefik 1.3) может быть запрошен для динамического создания таких URL.
Попробуйте воспользоваться одним из следующих вариантов:
traefik.ingress.kubernetes.io/rule-type: "PathPrefixStrip"
traefik.ingress.kubernetes.io/rewrite-target: "/
Оба они достигают схожих результатов, но они разные и ведут себя немного по-разному.
Я хотел бы больше узнать о различиях в нашей документации: (https://docs.traefik.io/v1.7/configuration/backends/kubernetes/)
Что касается вашей второй проблемы:
URL ресурса: local-ubuntu/public/css/bootstrap.min.css
Но это должно быть: local-ubuntu/db/public/css/bootstrap.min.css (который работает, когда я пробовал
Вы удалили этот путь из запроса... ваша служба БД никогда не видит префикс БД... Откуда он должен знать, чтобы добавить их обратно?
Вам необходимо установить корневой URL-адрес в своем веб-приложении для обработки удаленного пути.
После того, как вы это сделаете, вам может даже не понадобиться очищать путь, а просто оставьте его как есть. Если вы не можете установить базовый URL-адрес для своего приложения, возможно, вы не сможете использовать каталоги для маршрутизации и, возможно, придется вместо этого использовать поддомены.
Большое спасибо за вашу помощь в этом вопросе.
Прежде всего я должен был решить проблему с форматированием аннотаций в файле yaml.
Все инструкции с префиксом traefik должны быть заключены в двойные кавычки
Пример:
- traefik.ingress.kubernetes.io/rule-type: PathPrefixStrip [Not
правильный] - traefik.ingress.kubernetes.io/rule-type: "PathPrefixStrip"
[правильный]
В первом случае ни одна из аннотаций не была отражена во входе.
Но я все еще не могу правильно маршрутизировать трафик. При текущей конфигурации возвращается только обслуживаемый ресурс. Ни один из js, css или других ресурсов не загружен. Поэтому мне интересно, если мне нужно использовать инструкцию traefik.frontend.redirect.regex.
используйте только traefik.ingress.kubernetes.io/rule-type: PathPrefixStrip Ниже
то, что я использовал для отправки только подпути к моим модулям k8s
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: global-ingress
namespace: app
annotations:
kubernetes.io/ingress.class: "traefik"
traefik.ingress.kubernetes.io/rule-type: PathPrefixStrip