Маршрутизация на входе не учитывает префикс для перенаправлений 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 включен в несколько родительских документов.