设置nginx-ingress以将两个路径匹配到相同的serviceName和servicePort

时间:2019-10-22 18:04:42

标签: django docker kubernetes nginx-ingress

我要做什么

  • 前往/的交通需要转到运行在client上的FE 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,使其仅/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 :(得分:0)

在Django settings.py中添加了以下内容:

 FORCE_SCRIPT_NAME = '/api/'

更新STATIC_URL,因为它将不再为管理门户提供资产:

 STATIC_URL = '/api/static/`