使用不带通配符主机名的正则表达式路径匹配时 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/)(.*)
我已经使用 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/)(.*)