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

Kubernetes Ingress Validation Fails When Using Regex Path Matching Without Wildcard Hostnames

我已经使用 nginx 作为入口控制器在裸机 kubernetes 集群中部署了我的应用程序。我已经使用 <my-hostname>/<module-name> 部署了几个 ui 应用程序(由于客户的要求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: /
    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)/?(.*)

当我应用这个 Ingress 控制器时,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

但是当我使用 *.host.name 而不是 my.host.name 时,这没有错误。 我也需要限制我的主机名。

有人有解决办法吗?

this

上找到了答案

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

/(.*<api-pattern>/iam/)(.*)