如何解决kubernetes Ingress中的正则表达式路径未在Nginx Ingress Controller中创建为正则表达式位置
我正在使用Nginx Ingress Controller掌舵图0.6.0和Nginx Ingress Controller标签1.8.0,kubernetes 1.15。
当我在Ingress中定义使用正则表达式的路径时,该路径不起作用,因为未在Nginx控制器的配置文件位置部分中将其指定为正则表达式。
我需要使用nginx入口控制器的版本,该版本还支持VirtualServer和VirtualServerRoutes。
kind: Ingress
metadata:
name: test-ingress
namespace: ingress-test
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/use-regex: "true"
spec:
rules:
- host: test.any-xyz.com
http:
paths:
- path: /quack5/(.*)
backend:
serviceName: test
servicePort: 80
应用此命令时,nginx入口控制器已将位置设置为非正则表达式
$ kubectl -n nginx-ingress-controller exec nginx-ingress-controller-nginx-ingress-79984b9747-8pl4w -- grep -R quack /etc/nginx/conf.d
$ /etc/nginx/conf.d/ingress-test-test-ingress.conf: location /quack5/(.*) {
我希望看到位置〜* /quack5/(.*){
解决方法
尝试向Nginx Ingress Controller定义文件添加nginx.ingress.kubernetes.io/rewrite-target
注释。
删除nginx.ingress.kubernetes.io/use-regex: "true"
注释。
编辑:
我认为问题可能出在buildLocation函数(&& location.Rewrite.Target!=路径)中。如果路径和nginx.ingress.kubernetes.io/rewrite-target
相等,则nginx位置不以〜*为前缀,并作为正则表达式处理。
if len(location.Rewrite.Target) > 0 && location.Rewrite.Target != path {
if path == slash {
return fmt.Sprintf("~* %s",path)
}
// baseuri regex will parse basename from the given location
baseuri := `(?<baseuri>.*)`
if !strings.HasSuffix(path,slash) {
// Not treat the slash after "location path" as a part of baseuri
baseuri = fmt.Sprintf(`\/?%s`,baseuri)
}
return fmt.Sprintf(`~* ^%s%s`,path,baseuri)
}
return path
我建议使用一条指令来指定spec.rules.http.paths.path应该以正则表达式位置结尾,而不管nginx.ingress.kubernetes.io/rewrite-target
是什么(即使未指定)。当前,使位置受到正则表达式威胁的唯一方法(添加〜*)是定义一个与spec.rules.http.paths.path不同的nginx.ingress.kubernetes.io/rewrite-target
。
请查看:ingress-regex,ingress-path-matching,path-not-threated-as-regex。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。