Traefik PathPrefix не работает должным образом - PullRequest
0 голосов
/ 10 марта 2020

У меня есть сервис kube с ресурсом /customers, который вернет всех клиентов. Он также может вернуть указанного клиента c по номеру /customers/1. Я настроил вход Traefik следующим образом:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    traefik.frontend.rule.type: PathPrefix
  name: customerd
  namespace: video
spec:
  rules:
  - host: custd.kube
    http:
      paths:
      - backend:
          serviceName: customerd
          servicePort: http
        path: /customers
      - backend:
          serviceName: customerd
          servicePort: http
        path: /custdhealth
      - backend:
          serviceName: customerd
          servicePort: http
        path: /metrics
      - backend:
          serviceName: customerd
          servicePort: http
        path: /sleeper

Обратите внимание, что присутствует следующая аннотация: traefik.frontend.rule.type: PathPrefix. Из документации Traefik:

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

Проблема заключается в том, что когда я отправляю запрос на /customers/1, ответ - 404. подтвердил, что запрос не доходит до сервиса. Если я изменю PathPrefix на PathPrefixStrip, запросы на /customers вернут 404, как и ожидалось, поскольку служба не прослушивает /. Похоже, я правильно использую аннотацию.

Есть идеи, что я делаю неправильно, или дальнейшие шаги по устранению неполадок?

1 Ответ

0 голосов
/ 29 марта 2020

После дополнительной отладки я разобрался с проблемой. Это было не из-за того, как я использовал Traefik, это было недоразумение с моей стороны о том, как работает Golang HTTP-маршрутизация. Мой маршрут был закодирован как «/ клиенты». Оказывается, этот маршрут никогда не удовлетворит «/ клиентов / {id}». «/ Клиенты /» однако будут маршрутизировать как «/ клиенты», так и «/ клиенты / {id}». Так что после простого изменения кода все заработало.

Одним из факторов, осложняющих мои усилия по отладке, было то, что это поведение не видимо при проверке кода (не Golang библиотеки) или при добавлении сообщений журнала отладки.

...