【问题标题】:Setup nginx-ingress to match two paths to the same serviceName and servicePort设置 nginx-ingress 以匹配两个路径到相同的 serviceName 和 servicePort
【发布时间】:2020-02-18 22:37:03
【问题描述】:

我要做什么

  • / 的流量需要转到在3000 上运行的FE client
  • /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 从 URL 中删除 /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 中剥离出来?

【问题讨论】:

  • 您是否尝试访问将trailing 斜杠添加到原始 URL:/api/admin/ 的 Django 管理站点?我在类似的用户案例中遇到了这样的问题,发现 Nginx 引擎通过调用重写操作来阻止加载遵循/ root 子路径的某些特定内容。

标签: django docker kubernetes nginx-ingress


【解决方案1】:

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

 FORCE_SCRIPT_NAME = '/api/'

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

 STATIC_URL = '/api/static/`

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    • 2018-12-12
    相关资源
    最近更新 更多