设置 nginx-ingress 以将两条路径匹配到相同的 serviceName 和 servicePort
Setup nginx-ingress to match two paths to the same serviceName and servicePort
我想做什么
- 到
/
的流量需要转到 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: /
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/admin
中剥离 /api
?
向 Django settings.py 添加了以下内容:
FORCE_SCRIPT_NAME = '/api/'
更新 STATIC_URL 因为它将不再为管理门户提供资产:
STATIC_URL = '/api/static/`
我想做什么
- 到
/
的流量需要转到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: /
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/admin
中剥离/api
?
向 Django settings.py 添加了以下内容:
FORCE_SCRIPT_NAME = '/api/'
更新 STATIC_URL 因为它将不再为管理门户提供资产:
STATIC_URL = '/api/static/`