Работает над размещением Django API в Kubernetes.
Любой трафик, отправляемый на /
, контроллер ingress-nginx
отправляет в React FE. Любой трафик, отправляемый на /api
, отправляется в Django BE.
Это соответствующая часть ingress-serivce.yaml
:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-service
annotations:
kubernetes.io/ingress.class: nginx
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
Это url.py
:
из django.contrib администратор импорта из django.urls import include, path
urlpatterns = [
path('auth/', include('authentication.urls'), name='auth'),
path('admin/', admin.site.urls, name='admin'),
]
Часть client
работает просто отлично. minikube
IP равен 192.168.99.105
. При переходе по этому IP-адресу загружается интерфейс реагирования.
При переходе по 192.168.99.105/api/auth/test/
я попадаю в "Hello World!"ответ, который я быстро составил.
Однако, когда я пытаюсь перейти к 192.168.99.105/api/admin
. Он автоматически перенаправляет меня на /admin/login/?next=/admin/
, который не существует, если удалить /api
. Есть ли способ предотвратить такое поведение?
Я также только что попробовал это:
ingress-service.yaml
- 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
urls.py
urlpatterns = [
path('auth/', include('authentication.urls'), name='auth'),
path('/', admin.site.urls),
]
, который просто выдает "Not Found".
Я попытался использовать префикс также, используя этот шаблон, который отображается в документация :
urlpatterns = [
path('api/', include([
path('auth/', include('authentication.urls'), name='auth'),
path('admin/', admin.site.urls),
])),
]
Но это только что сделало это /api/api
.
Вот маршруты, которые определены для admin/
в site-packages/django/contrib/admin/sites
:
# Admin-site-wide views.
urlpatterns = [
path('', wrap(self.index), name='index'),
path('login/', self.login, name='login'),
path('logout/', wrap(self.logout), name='logout'),
path('password_change/', wrap(self.password_change, cacheable=True), name='password_change'),
path(
'password_change/done/',
wrap(self.password_change_done, cacheable=True),
name='password_change_done',
),
path('jsi18n/', wrap(self.i18n_javascript, cacheable=True), name='jsi18n'),
path(
'r/<int:content_type_id>/<path:object_id>/',
wrap(contenttype_views.shortcut),
name='view_on_site',
),
]
Я думаю, ''
- это то, что заставляет Django удалить /api
из URL и сделать его просто 192.168.99.105/admin
вместо 192.168.99.105/api/admin
.