Маршрутизация на входе не учитывает префикс для перенаправлений django

Я развернул приложение Django в кластере K8s, и у меня возникли некоторые проблемы с маршрутизацией Ingress.

Конфигурация ингресса:

apiVersion: projectcontour.io/v1
kind: HTTPProxy
metadata:
  name: main
  namespace: ${namespace}
spec:
  routes:
    - conditions:
        - prefix: /my-app
      services:
        - name: my-app-backend
          port: 80
      timeoutPolicy:
        response: 60s
  pathRewritePolicy:
    replacePrefix:
      - replacement: /

my-app/urls.py

from django.urls import include, path
from overview import views

app_name = "overview"

urlpatterns = [
    path("", views.index),
    path("overview", views.overview)
    ...
]

У меня есть url типа example.com, где пути перенаправляются на несколько сервисов K8s.

URL example.com/my-app/ должен быть разрешен в мой сервис "my-app". Пока все хорошо, я могу видеть входную страницу моего приложения.

Но если я начинаю нажимать на кнопки отсюда, относительные перенаправления, сделанные Django, не работают так, как ожидалось:

Нажатие кнопки, которая должна перевести меня на example.com/my-app/overview, переходит на example.com/overview, что приводит к очевидному результату 404.

Я бы ожидал префикс /my-app/ для всех перенаправлений в my-app. Я новичок в Ingress, но я бы предположил, что my-app не должен отвечать за эту информацию, так как мне придется менять два репозитория при изменении пути к домену (а я хочу избежать маршрутизаторов или жесткого кодирования url с префиксом /my-app/).

Могу ли я добиться такого ожидаемого поведения с помощью Ingress, или какова наилучшая практика в этом случае?

Я новичок в Ingress, но я предполагаю, что my-app не должен отвечать за эту информацию, поскольку мне придется менять два репозитория, когда путь к домену изменится (а я хочу избежать маршрутизаторов или жесткого кодирования url с префиксом /my-app/).

Это не задача приложения. Вы правильно сказали, что об этом должен позаботиться ingress. Ваш ingress настроен неправильно. Сначала посмотрите официальную документацию:

Если присутствует поле prefix, замена применяется только к тем маршрутам, которые имеют точно совпадающие условия префикса

В ситуации, когда вы хотите открыть example.com/my-app/overview, вы перенаправляетесь на example.com/overview, потому что my-app был заменен на /. Похоже, что вам вообще не нужно менять пути.

Но если вы хотите немного изменить свой yaml, возьмите следующий пример и адаптируйте его под свои нужды, предоставив соответствующие префиксы и замены.

apiVersion: projectcontour.io/v1
kind: HTTPProxy
metadata:
  name: rewrite-example
  namespace: default
spec:
  virtualhost:
    fqdn: rewrite.bar.com
  routes:
  - services:
    - name: s1
      port: 80
    conditions:
    - prefix: /v1/api
    pathRewritePolicy:
      replacePrefix:
      - prefix: /v1/api
        replacement: /app/api/v1
      - prefix: /
        replacement: /app

Если поле prefix отсутствует, замена применяется ко всем совпадениям префикса с маршрутом. Если присутствует поле prefix, замена применяется только к тем маршрутам, которые имеют точно совпадающее условие префикса. Указание более чем одной записи replacePrefix в основном полезно, когда документ HTTPProxy включен в несколько родительских документов.

Вернуться на верх