Kubernetes 无法通过GKE上的入口访问资源
我正在尝试创建一个入口资源,将两个运行正常的服务扇出。这是我非常简单的配置:Kubernetes 无法通过GKE上的入口访问资源,kubernetes,google-cloud-platform,google-kubernetes-engine,devops,kubernetes-ingress,Kubernetes,Google Cloud Platform,Google Kubernetes Engine,Devops,Kubernetes Ingress,我正在尝试创建一个入口资源,将两个运行正常的服务扇出。这是我非常简单的配置: apiVersion: extensions/v1beta1 kind: Ingress metadata: name: my-ingress namespace: default spec: rules: - http: paths: - path: /* backend: serviceName: servi
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-ingress
namespace: default
spec:
rules:
- http:
paths:
- path: /*
backend:
serviceName: service1
servicePort: 8080
- path: /service2/*
backend:
serviceName: service2
servicePort: 9090
似乎只有对根/路径的请求才起作用。我一直试图用类似的在线帖子来解决这个问题,但没有任何效果
我能做什么
编辑:
此配置在Minikube上运行良好,但在GKE上不起作用?如果您使用的是GKE的默认入口控制器,那么yaml在我看来很不错。我建议您重新检查服务,即节点端口类型的服务1、服务2,并确保它们工作正常 如果您使用的是上述版本或等于nginx-0.20.0的版本,则需要将nginx.ingres.kubernetes.io/use-regex注释设置为true,默认值为false以启用区分大小写的正则表达式 就像:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-ingress
namespace: default
annotations:
nginx.ingress.kubernetes.io/use-regex: "true"
spec:
rules:
- http:
paths:
- path: /*
backend:
serviceName: service1
servicePort: 8080
- path: /service2/*
backend:
serviceName: service2
servicePort: 9090
我在Azure上有一个工作配置,它非常简单,但在一些方面与您的不同。我相应地重写了您的yaml,看看这是否有帮助:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-ingress
namespace: default
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
rules:
- http:
paths:
- path: /service2/?(.*)
backend:
serviceName: service2
servicePort: 9090
- path: /?(.*)
backend:
serviceName: service1
servicePort: 8080
显著的区别是:
路径被翻转,以便更具体的路径更高。不确定这是否有任何影响。
将简单通配符更改为前瞻:*=>?*。这允许我使用nginx.ingres.kubernetes.io/rewrite-target注释来确保不会丢失/service2/后面的url部分。因此,如果您调用的不是/service2/确切地说,这可能会有所帮助。
如果您正在使用nginx,请查看此文件
如果您正在使用traefik,请尝试:
你在服务2上得到了什么?404?是的,我在service2上得到了一个404。您的后端的path/service2上有任何服务吗?404表示请求正在到达后端,那里什么都没有。如果您检查了service2的一个后端上的日志,您应该会看到请求与错误一起出现,这将有助于您调试此服务。谢谢!这似乎对Minikube有效,但我在GKE上仍然有问题。通过将我的服务从LoadBalancer更改为kind NodePort,我现在可以访问Minikube集群上的资源。然而,当我试图通过我的GKE cluster.interest访问service2时,我现在得到了默认的后端404。这与我的配置在Minikube上的工作方式完全相同,但在GKE上我得到了以下错误:``同步期间出错:运行负载平衡器同步例程时出错:loadbalancer default-my-ingress-cbc24f100656b420不存在:CreateUrlMap:googleapi:error 400:字段“resource”的值无效:'{name:k8s-um-default-my-ingress-cbc24f100656b420,hostRule:[{host:[*],…'。无效的路径模式,无效的``您是否尝试过按照前面的建议将nginx.ingres.kubernetes.io/use-regex:true添加到此配置中?
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: traefik
name: my-ingress
spec:
rules:
- http:
paths:
- path: /
backend:
serviceName: service1
- path: /service2/
backend:
serviceName: service2