【发布时间】:2020-02-18 22:37:03
【问题描述】:
我要做什么
- 到
/的流量需要转到在3000上运行的FEclient。 - 到
/api的流量需要到BEserver。
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