Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kubernetes 无法通过GKE上的入口访问资源_Kubernetes_Google Cloud Platform_Google Kubernetes Engine_Devops_Kubernetes Ingress - Fatal编程技术网

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