我有一个入口控制器和入口资源,其中所有 /devops 都映射到后端的 devopsservice。当我尝试点击“http://hostname/devops”时,一切正常,我得到一个页面(尽管没有CSS和样式),其中包含一组超链接,例如其中一个是“logs”。
当我单击“日志”超链接时,它会将我重定向到 http://hostname/logs,而我需要它是 http://hostname/devops/logs。
知道我能做什么吗?
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-ingress
namespace: ingress-nginx
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/add-base-url : "true"
spec:
rules:
- host: master1.dev.local
http:
paths:
- backend:
serviceName: devops1
servicePort: 10311
path: /devops
看起来您的入口没有提供任何服务
/devops/*
。尝试添加另一个具有相同后端的路径/devops/*
。基本上是这样的:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-ingress
namespace: ingress-nginx
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/add-base-url : "true"
spec:
rules:
- host: master1.dev.local
http:
paths:
- backend:
serviceName: devops1
servicePort: 10311
path: /devops/*
- backend:
serviceName: devops1
servicePort: 10311
path: /devops
更新:上面的内容已被弃用,取而代之的是这样的:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
name: rewrite
namespace: default
spec:
rules:
- host: master1.dev.local
http:
paths:
- backend:
serviceName: devops1
servicePort: 10311
path: /devops(/|$)(.*)
如果您直接从浏览器访问
http://hostname/devops/logs
,您肯定会得到您想要的。但既然你点击首页的超链接,那么你只能得到http://hostname/logs
,肯定会失败。
因此,您需要在入口 yaml 中配置
/logs
后端来处理它,并配置 nginx.ingress.kubernetes.io/configuration-snippet
以确保 /logs
不会被重写,如下所示:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-ingress
namespace: ingress-nginx
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/add-base-url : "true"
nginx.ingress.kubernetes.io/configuration-snippet: |
rewrite ^/logs /logs break;
spec:
rules:
- host: master1.dev.local
http:
paths:
- backend:
serviceName: devops1
servicePort: 10311
path: /logs
- backend:
serviceName: devops1
servicePort: 10311
path: /devops
我最近遇到了类似的问题。
假设您的html中的“logs”超链接使用相对路径,这意味着超链接不以“/”开头,那么我认为您可以尝试访问http://hostname/devops/而不是http的页面://主机名/devops。 (注意第一个网址中的 / 后缀。)。
然后“logs”超链接将形成http://hostname/devops/logs。
我认为这与浏览器如何识别“基本”网址有关。访问“http://hostname/devops/”时,如果html标头中没有“base”标签,则“base”url将被计算为http://hostname/devops;而使用“http://hostname/devops”时,基本 URL 将为 http://hostname。
如果不是这种情况,请在https://github.com/kubernetes/ingress-nginx/issues/4149进行讨论。建议使用带有配置片段的 nginx 指令 subs_filter 来使 href 属性相对,并在 html 标头中添加基本标签。
使用的入口如下,
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
name: rewrite
namespace: default
spec:
rules:
- host: master1.dev.local
http:
paths:
- backend:
serviceName: devops1
servicePort: 10311
path: /devops(/|$)(.*)
nginx.ingress.kubernetes.io/x-forwarded-prefix
注释 可用于此目的。 它将
x-forwarded-prefix
标头添加到 http 请求中,并使用此注释中的值。如果您的后端支持此类标头,您可以使用它。例如,Spring Boot应用程序可以使用属性来处理它:
server.forward-headers-strategy=framework
在您的情况下,入口将如下所示:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-ingress
namespace: ingress-nginx
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/x-forwarded-prefix: /devops
spec:
rules:
- host: master1.dev.local
http:
paths:
- backend:
serviceName: devops1
servicePort: 10311
path: /devops
这个解决方案有其缺点。它迫使您在单独的入口中声明每个服务。