使用不带通配符主机名的正则表达式路径匹配时,Kubernetes入口验证失败

使用不带通配符主机名的正则表达式路径匹配时,Kubernetes入口验证失败,kubernetes,kubernetes-ingress,Kubernetes,Kubernetes Ingress,我已经将我的应用程序部署在一个使用nginx作为入口控制器的纯金属kubernetes集群中。我已经使用/部署了多个ui应用程序(由于客户的要求,我无法更改)。我已经编写了以下入口规则来访问我的API和模块 apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: annotations: kubernetes.io/ingress.class: nginx kubernetes.io/tls-acme: &q

我已经将我的应用程序部署在一个使用nginx作为入口控制器的纯金属kubernetes集群中。我已经使用
/
部署了多个ui应用程序(由于客户的要求,我无法更改)。我已经编写了以下入口规则来访问我的API和模块

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    kubernetes.io/tls-acme: "true"
    nginx.ingress.kubernetes.io/proxy-body-size: 100m
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    nginx.ingress.kubernetes.io/ssl-passthrough: "true"
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.org/proxy-connect-timeout: 60s
    nginx.org/proxy-read-timeout: 60s
  name: test-ingress
  namespace: csi-dev
spec:
  rules:
  - host: 'my.host.name'
    http:
      paths:
      - backend:
          serviceName: security-servicename
          servicePort: 80
        path: (/<api-pattern>/iam/)(.*)
      - backend:
          serviceName: api-gateway-servicename
          servicePort: 80
        path: (/<api-pattern>/)(.*)
      - backend:
          serviceName: ui-config-server-servicename
          servicePort: 80
        path: (/<ui-config-server-pattern>/)(.*)
      - backend:
          serviceName: ui-module1-servicename
          servicePort: 80
        path: /(ui-module1)/?(.*)
      - backend:
          serviceName: ui-module1-servicename
          servicePort: 80
        path: /(ui-module2)/?(.*)
      - backend:
          serviceName: ui-module1-servicename
          servicePort: 80
        path: /(ui-module3)/?(.*)
apiVersion:networking.k8s.io/v1beta1 种类:入口 元数据: 注释: kubernetes.io/ingres.class:nginx kubernetes.io/tls-acme:“正确” nginx.ingres.kubernetes.io/proxy-body-size:100m nginx.ingres.kubernetes.io/rewrite-target://2美元 nginx.ingres.kubernetes.io/ssl-passthrough:“true” nginx.ingres.kubernetes.io/ssl-redirect:“false” nginx.ingres.kubernetes.io/use-regex:“true” nginx.org/proxy-connect-timeout:60s nginx.org/proxy-read-timeout:60s 名称:测试入口 名称空间:csi-dev 规格: 规则: -主持人:“我的。主持人。姓名” http: 路径: -后端: 服务名称:安全服务名称 服务端口:80 路径:(//iam/)(**) -后端: serviceName:api网关serviceName 服务端口:80 路径:(//)(*) -后端: serviceName:ui配置服务器serviceName 服务端口:80 路径:(//)(*) -后端: serviceName:ui-module1-serviceName 服务端口:80 路径:/(ui-module1)/?(*) -后端: serviceName:ui-module1-serviceName 服务端口:80 路径:/(ui-module2)/?(*) -后端: serviceName:ui-module1-serviceName 服务端口:80 路径:/(ui-module3)/?(*) 当我应用这个入口控制器时,Kubernetes给了我以下错误

* spec.rules[0].http.paths[0].path: Invalid value: "(.*/<api-pattern>/iam/)(.*)": must be an absolute path
* spec.rules[0].http.paths[1].path: Invalid value: "(.*/<api-pattern>/)(.*)": must be an absolute path
* spec.rules[0].http.paths[2].path: Invalid value: "(.*/<ui-config-server>/)(.*)": must be an absolute path
*spec.rules[0]。http.path[0]。路径:无效值:(.*//iam/)(.*):必须是绝对路径
*spec.rules[0]。http.paths[1]。路径:无效值:(.*/)(.*):必须是绝对路径
*spec.rules[0]。http.paths[2]。路径:无效值:(.*/)(.*):必须是绝对路径
但是,当我使用
*.host.name
而不是
my.host.name
时,这种方法不会出错。 我还需要限制我的主机名

有人有解决办法吗?

在上找到了答案

当主机名没有通配符时,Kubernetes API验证
spec.rules[n].http.paths[m].path
是否具有
/
。因此,重写路径如下

/(.*/iam/)(.*)