nginx 路径值无效
Invalid value for nginx path
我的nginx ingress如下:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: nginx
annotations:
kubernetes.io/ingress.global-static-ip-name: "gcloud-ip"
nginx.ingress.kubernetes.io/rewrite-target: /
kubernetes.io/ingress.class: "nginx"
spec:
backend:
serviceName: nginx
servicePort: 80
rules:
- http:
paths:
- path: /?(.*)
backend:
serviceName: client
servicePort: 3333
- path: /api/?(.*)
backend:
serviceName: hasura-svc
servicePort: 8080
我得到:
googleapi: Error 400: Invalid value for field 'resource': '{ "name": "k8s2-um-zhm30g1t-default-nginx-ymq8cimb", "hostRule": [{ "host": ["*"], "pathMatc...'. Invalid path pattern, invalid
查看了很多资源,这没有意义,因为正则表达式有效且注释正确,我相信有人可以帮忙吗?
您正在混合来自 2 个入口控件的注释。 GCP Ingress and Nginx Ingress.
注解 kubernetes.io/ingress.global-static-ip-name:
是 GCP Ingress
特定的,不能与 Nginx Ingress
等不同的 Ingress
控制器一起使用。您不会在 Nginx Ingress Annotation List.
中找到此注释
在同一个 Ingress
对象中,您正在使用 rewrite
特定的 Nginx Ingress
注释。
总而言之,您在使用来自 2 个不同控制器的 2 个注释时收到此错误。可以找到类似的问题 .
要解决您的问题,您必须决定使用哪个 Ingress Controller
。请在下面找到两个选项:
GCP 入口
如果您想使用 GCP Ingress
,您必须使用没有 NGINX Ingress
控制器的 rewrite
功能的路径。
而不是:
paths:
- path: /?(.*)
...
- path: /api/?(.*)
使用:
paths:
- path: /
...
- path: /api/
公开应用的服务必须是 NodePort
类型。此外,您还需要 删除 两个注释:
nginx.ingress.kubernetes.io/rewrite-target: /
kubernetes.io/ingress.class: "nginx"
NGINX 入口
由于注释 kubernetes.io/ingress.global-static-ip-name
是 Google 云特定的,您不能将其与 kubernetes.io/ingress.class: nginx
一起使用。
如果您在 GCP
中保留了 Static IP
,您应该在 Nginx Ingress Controller
中将此 IP 应用为 loadBalancerIP
,而不是在 Ingress
资源中。
我已经描述了如何使用保留的静态 IP 部署 Nginx Ingress Controller
。您可以通过以下link:
找到它
- whosebug.com: Questions: Google Cloud Kubernetes Ingress static IP address not reflected.
请记住,答案是几个月前的,从那以后回购已经改变了。对于最新的选项,您应该使用以下命令。请记住将 <YourGlobalIP>
更改为您的 ReservedIP
.
$ helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
$ helm repo update
$ helm install nginx-ingress ingress-nginx/ingress-nginx --set controller.service.loadBalancerIP=<YourGlobalIP>,rbac.create=true
Helm 将部署 Nginx Ingress Controller
和 ReservedIP
。稍后您将需要删除 kubernetes.io/ingress.global-static-ip-name
注释并部署 Ingress
.
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- http:
paths:
- path: /?(.*)
backend:
serviceName: first-service
servicePort: 81
- path: /api/?(.*)
backend:
serviceName: second-service
servicePort: 82
旁注
请记住,保留地址必须是 Network Service Tier: Premium
,并且 Region
必须与您的集群相同。从 nginx-ingress-controller
发送流量的服务应该是:ClusterIP
或 NodePort
.
我已经使用 2 个 hello world 应用程序 v1、v2 和 IP 保留测试了这个场景:35.222.174.237
us-central1
$ kubectl get ing
NAME HOSTS ADDRESS PORTS AGE
ingress * 35.222.174.2377 80 27s
$ curl 35.222.174.237/api/something
Hello, world!
Version: 2.0.0
Hostname: second-deployment-5b5bbb7f4-tzsd4
$ curl 35.222.174.237/test
Hello, world!
Version: 1.0.0
Hostname: first-deployment-85b75bf4f9-rtbn9
我的nginx ingress如下:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: nginx
annotations:
kubernetes.io/ingress.global-static-ip-name: "gcloud-ip"
nginx.ingress.kubernetes.io/rewrite-target: /
kubernetes.io/ingress.class: "nginx"
spec:
backend:
serviceName: nginx
servicePort: 80
rules:
- http:
paths:
- path: /?(.*)
backend:
serviceName: client
servicePort: 3333
- path: /api/?(.*)
backend:
serviceName: hasura-svc
servicePort: 8080
我得到:
googleapi: Error 400: Invalid value for field 'resource': '{ "name": "k8s2-um-zhm30g1t-default-nginx-ymq8cimb", "hostRule": [{ "host": ["*"], "pathMatc...'. Invalid path pattern, invalid
查看了很多资源,这没有意义,因为正则表达式有效且注释正确,我相信有人可以帮忙吗?
您正在混合来自 2 个入口控件的注释。 GCP Ingress and Nginx Ingress.
注解 kubernetes.io/ingress.global-static-ip-name:
是 GCP Ingress
特定的,不能与 Nginx Ingress
等不同的 Ingress
控制器一起使用。您不会在 Nginx Ingress Annotation List.
在同一个 Ingress
对象中,您正在使用 rewrite
特定的 Nginx Ingress
注释。
总而言之,您在使用来自 2 个不同控制器的 2 个注释时收到此错误。可以找到类似的问题
要解决您的问题,您必须决定使用哪个 Ingress Controller
。请在下面找到两个选项:
GCP 入口
如果您想使用 GCP Ingress
,您必须使用没有 NGINX Ingress
控制器的 rewrite
功能的路径。
而不是:
paths:
- path: /?(.*)
...
- path: /api/?(.*)
使用:
paths:
- path: /
...
- path: /api/
公开应用的服务必须是 NodePort
类型。此外,您还需要 删除 两个注释:
nginx.ingress.kubernetes.io/rewrite-target: /
kubernetes.io/ingress.class: "nginx"
NGINX 入口
由于注释 kubernetes.io/ingress.global-static-ip-name
是 Google 云特定的,您不能将其与 kubernetes.io/ingress.class: nginx
一起使用。
如果您在 GCP
中保留了 Static IP
,您应该在 Nginx Ingress Controller
中将此 IP 应用为 loadBalancerIP
,而不是在 Ingress
资源中。
我已经描述了如何使用保留的静态 IP 部署 Nginx Ingress Controller
。您可以通过以下link:
- whosebug.com: Questions: Google Cloud Kubernetes Ingress static IP address not reflected.
请记住,答案是几个月前的,从那以后回购已经改变了。对于最新的选项,您应该使用以下命令。请记住将 <YourGlobalIP>
更改为您的 ReservedIP
.
$ helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
$ helm repo update
$ helm install nginx-ingress ingress-nginx/ingress-nginx --set controller.service.loadBalancerIP=<YourGlobalIP>,rbac.create=true
Helm 将部署 Nginx Ingress Controller
和 ReservedIP
。稍后您将需要删除 kubernetes.io/ingress.global-static-ip-name
注释并部署 Ingress
.
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- http:
paths:
- path: /?(.*)
backend:
serviceName: first-service
servicePort: 81
- path: /api/?(.*)
backend:
serviceName: second-service
servicePort: 82
旁注
请记住,保留地址必须是 Network Service Tier: Premium
,并且 Region
必须与您的集群相同。从 nginx-ingress-controller
发送流量的服务应该是:ClusterIP
或 NodePort
.
我已经使用 2 个 hello world 应用程序 v1、v2 和 IP 保留测试了这个场景:35.222.174.237
us-central1
$ kubectl get ing
NAME HOSTS ADDRESS PORTS AGE
ingress * 35.222.174.2377 80 27s
$ curl 35.222.174.237/api/something
Hello, world!
Version: 2.0.0
Hostname: second-deployment-5b5bbb7f4-tzsd4
$ curl 35.222.174.237/test
Hello, world!
Version: 1.0.0
Hostname: first-deployment-85b75bf4f9-rtbn9