Работаем над внедрением 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 import admin из 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),
]
Который просто выдает «Не найдено».
Я также попытался использовать префикс, используя этот шаблон, который отображается в документация:
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
.
/api
, stackoverflow.com/questions/20997863/ - person Efrat Levitan   schedule 22.10.2019/auth/test
и/admin
возвращать"Not Found"
. Проверьтеingress-service.yaml
. Любой трафик для BE проходит уже с префиксом/api
. Поэтому, если он имеет префикс вurls.py
, напримерpath('api/auth'....
, вам нужно перейти к/api/api/auth/test/
, чтобы получить ответ. Не уверен, что это лучший способ справиться с этим, но я не думаю, что удаление/api/?(.*)
действительно вариант, поскольку его нужно выставить. - person cjones   schedule 22.10.2019/api/api/
. Я также обновил свой полныйingress-service.yaml
на случай, если что-то еще может быть причиной этого. - person cjones   schedule 22.10.2019