我的nginx入口如下:
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: /$1
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
我看了很多资源,但这没有意义,因为regexp是有效的,注释是正确的,我相信有人能帮忙吗?
您正在混合来自2个入口控件的注释。GCP Ingress和Nginx Ingress。
注释kubernetes.io/ingress.global-static-ip-name:
是特定于GCP Ingress
的,不能与Nginx Ingress
等不同的Ingress
控制器一起使用。在Nginx入口注释列表中找不到此注释。
在同一个Ingress
对象中,您使用的是特定于Nginx Ingress
的rewrite
注释。
总之,当您使用来自2个不同控制器的2个注释时,会出现此错误。类似的问题可以在这里找到。
要解决您的问题,您必须决定使用哪种Ingress Controller
。请在下面找到两个选项:
GCP INGRESS
如果你想使用GCP Ingress
,你必须使用没有NGINX Ingress
控制器的rewrite
功能的路径。
代替:
paths:
- path: /?(.*)
...
- path: /api/?(.*)
用途:
paths:
- path: /
...
- path: /api/
公开应用程序的服务必须为NodePort
类型。此外,您还需要删除两个注释:
nginx.ingress.kubernetes.io/rewrite-target: /$1
kubernetes.io/ingress.class: "nginx"
NGINX INGRESS
由于注释kubernetes.io/ingress.global-static-ip-name
是特定于Google Cloud的,因此不能将其与kubernetes.io/ingress.class: nginx
一起使用。
如果您在GCP
中保留了Static IP
,则应将此IP作为Nginx Ingress Controller
中的loadBalancerIP
应用,而不是在Ingress
资源中。
我已经描述了如何使用保留的静态IP部署Nginx Ingress Controller
。您可以通过以下链接找到它:
- Stackoverlow.com:问题:Google Cloud Kubernetes Ingress静态IP地址未反映
请记住,答案是几个月前的,从那时起回购就发生了变化。对于最新的选项,您应该使用以下命令。请记住将<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: /$1
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
。
我已经用两个helloworld应用程序v1、v2测试了这个场景,保留的IP是:us-central1
上的35.222.174.237
$ 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