Настройте nginx-вход, чтобы сопоставить два пути к одному и тому же serviceName и servicePort - PullRequest
0 голосов
/ 22 октября 2019

Что я пытаюсь сделать

  • Трафик на / должен идти к 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? ​​

1 Ответ

0 голосов
/ 04 ноября 2019

Добавлено следующее в настройки Django.py:

 FORCE_SCRIPT_NAME = '/api/'

Обновите STATIC_URL, поскольку он больше не будет обслуживать ресурсы для административного портала:

 STATIC_URL = '/api/static/`
...