Что я пытаюсь сделать
- Трафик на
/
должен идти к FE client
, работающему на 3000
. - Трафик на
/api
должен идти на BE server
.
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-service
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/add-base-url: "true"
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
rules:
- http:
paths:
- path: /?(.*)
backend:
serviceName: client-cluster-ip-service
servicePort: 3000
- path: /api?/(.*)
backend:
serviceName: server-cluster-ip-service
servicePort: 5000
Проблема
# urls.py
urlpatterns = [
path('auth/', include('authentication.urls')),
path('admin/', admin.site.urls),
]
- Загрузка в
/api/auth
работает нормально. - Не доставляет
/api/admin
. Django удаляет /api
из URL, делая его просто /admin
, который не существует. Кажется, это стандартное поведение Django. Насколько я могу судить, переопределить его невозможно.
Что работает
- path: /?(.*)
backend:
serviceName: server-cluster-ip-service
servicePort: 5000
- Переход к
/admin
работает отлично. - Однако это устраняет возможность перенаправления трафика на
client
.
Каким-то образом мне нужно запретить Django удалять префикс. Или, может быть, есть способ обработки этого типа маршрутизации из nginx-ingress
.
Что не работает
Любое изменение из следующего:
- http:
paths:
- path: /?(.*)
backend:
serviceName: client-cluster-ip-service
servicePort: 3000
- path: /api?/(.*)
backend:
serviceName: server-cluster-ip-service
servicePort: 5000
- path: /admin?/(.*)
backend:
serviceName: server-cluster-ip-service
servicePort: 5000
urlpatterns = [
path('auth/', include('authentication.urls')),
path('/', admin.site.urls),
]
urlpatterns = [
path('auth/', include('authentication.urls')),
path('', admin.site.urls),
]
urlpatterns = [
path('auth/', include('authentication.urls')),
path('api/admin/', admin.site.urls), # this justmakes it /api/api/admin given the ingress
]
# This just makes the URL pattern:
# - /api/api/auth/
# - /api/api/admin/
urlpatterns = [
path('api/', include([
path('auth/', include('authentication.urls'), name='auth'),
path('admin/', admin.site.urls),
])),
]
Вопрос
Так что не совсем уверен, какчтобы решить эту проблему.
- Есть ли способ решить эту проблему с помощью
nginx-ingress
? Каким-то образом убрать /api
после отправки запроса? - Есть ли способ предотвратить поведение Django по умолчанию, которое снимает
/api
с /api/admin
?