使用不带通配符主机名的正则表达式路径匹配时,Kubernetes入口验证失败
我已经将我的应用程序部署在一个使用nginx作为入口控制器的纯金属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
/
部署了多个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/)(.*)