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-regexingress-path-matchingpath-not-threated-as-regex

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...