我在K8s集群中部署了一个Django应用程序,Ingress的路由有一些问题。
入口配置:
apiVersion: projectcontour.io/v1
kind: HTTPProxy
metadata:
name: main
namespace: ${namespace}
spec:
routes:
- conditions:
- prefix: /my-app
services:
- name: my-app-backend
port: 80
timeoutPolicy:
response: 60s
pathRewritePolicy:
replacePrefix:
- replacement: /
我的应用程序/网址.py
from django.urls import include, path
from overview import views
app_name = "overview"
urlpatterns = [
path("", views.index),
path("overview", views.overview)
...
]
我有一个类似example.com
的url,其中的路径被重定向到几个K8服务。
URLexample.com/my-app/
应该解析为我的服务my-app
。到目前为止还不错,我可以看到我的应用程序的入口页面。
但如果我从这里开始点击按钮,Django所做的相对重定向并没有像预期的那样工作:
点击按钮,期望将我导航到CCD_ 4,靶向CCD_ 5,明显导致404。
我希望my-app
中的所有重定向都有一个/my-app/
前缀。我是Ingress新手,但我认为my-app
不应该对这些信息负责,因为当域路径最终发生变化时,我必须更改两个repo(我想避免路由器或对前缀为/my-app/
的url进行硬编码(。
我能和Ingress一起达到预期的行为吗?或者这里的最佳实践是什么?
我是Ingress新手,但我认为我的应用程序不应该对这些信息负责,因为当域路径最终更改时,我必须更改两个repo(我想避免路由器或硬编码前缀为/my-app/的url(。
这不是应用程序任务。你说得对,应该通过入口来处理。您的入口配置不正确。首先看一下官方文件:
如果存在
prefix
字段,则替换仅应用于具有完全匹配前缀条件的路由
在想要打开example.com/my-app/overview
的情况下,会重定向到example.com/overview
,因为my-app
已被/
替换。看起来你根本不需要改变路径。
但是,如果您想稍微更改您的yaml,请以以下为例,并通过提供适当的前缀和替换来适应您的需求。
apiVersion: projectcontour.io/v1
kind: HTTPProxy
metadata:
name: rewrite-example
namespace: default
spec:
virtualhost:
fqdn: rewrite.bar.com
routes:
- services:
- name: s1
port: 80
conditions:
- prefix: /v1/api
pathRewritePolicy:
replacePrefix:
- prefix: /v1/api
replacement: /app/api/v1
- prefix: /
replacement: /app
如果不存在
prefix
字段,则替换将应用于针对路由进行的所有前缀匹配。如果存在prefix
字段,则替换仅应用于具有完全匹配前缀条件的路由。当HTTPProxy文档包含在多个父文档中时,指定多个replacePrefix
条目非常有用。