GKE Ingress 和 GCP 负载均衡器:总是得到 404

GKE Ingres and GCE Load balancer : Always get 404

我尝试部署 2 个应用程序(在 2 个独立的 Deployments 对象后面)。我每个部署有 1 个服务,类型为 NodePort.

application1_service.yaml

apiVersion: v1
kind: Service
metadata:
  name: application1-service
  namespace: default
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    run: application1
  type: NodePort

application2_service.yaml 完全相同namerun 除外)

我使用 Ingress 使这 2 个服务可用,

ingress.yaml

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    kubernetes.io/ingress.global-static-ip-name: "my-static-ip"
    networking.gke.io/managed-certificates: "my-certificate"
    kubernetes.io/ingress.class: "gce"
spec:
  rules:
  - host: "my.host.com"
    http:
      paths:
      - path: /*
        backend:
          serviceName: application1-service
          servicePort: 80
      - path: /application2/*
        backend:
          serviceName: application2-service
          servicePort: 80

我还创建了一个 ManagedCertificate 对象,以便能够处理 HTTPS 请求。

managed_certificate.yaml

apiVersion: networking.gke.io/v1beta1
kind: ManagedCertificate
metadata:
  name: my-certificate 
spec:
  domains:
    - my.host.com

奇怪的是 curl https://my.host.com/ 工作正常,我可以访问我的服务,但是当我尝试 curl https://my.host.com/application2/ 时,我一直收到 404 Not Found.

为什么 root 有效而另一个无效?

附加信息: ManagedCertificate 有效并且可以与 / 一起正常工作。 application1 和 application2 是完全相同的应用程序,如果我在入口交换它们,输出是相同的。

感谢您的帮助!

编辑:

这是我尝试访问 application2 时得到的 404

不知道它是否有帮助,但这里也是显示 404

的 Ingress 访问日志的一部分

我认为您不能为 2 个不同的应用程序使用同一个端口,因为每个节点都使用此端口来路由到一个应用程序。

来自文档:

NodePort: Exposes the Service on each Node's IP at a static port (the NodePort). A ClusterIP Service, to which the NodePort Service routes, is automatically created. You'll be able to contact the NodePort Service, from outside the cluster, by requesting :.

因此在您的情况下,一个应用程序已经在使用端口 80,您可以尝试为应用程序 2 使用另一个应用程序

  • 我在没有域的情况下复制了这个问题并管理了一个 证书。对我来说,使用 Load Balancer IP 效果很好 地址。

               (ingress-316204)$ curl http://<LB IP address>/v2/
                               Hello, world!
                               Version: 2.0.0
                               Hostname: web2-XXX
    
               (ingress-316204)$ curl http://<LB IP address>/
                               Hello, world!
                               Version: 1.0.0
                               Hostname: web-XXX
    
  • Ingress 配置似乎符合 doc。检查 curl https://LB IP address/application2/ 是否正常工作,如果正常,则主机名可能存在问题。

  • 检查您是否更新主机文件 (/etc/hosts) LB IP 地址 my.host.com.

  • 检查Load中host、path、backend是否配置正确 平衡器配置。

  • 如果问题仍然存在,请检查 PortNodeportTargetport 正确配置或共享 'kubectl describe ing my-ingress' 的输出以供进一步调查。

回答我自己的问题:

找了几天终于找到了问题的原因

集群和配置一切正常,我的问题出在我的 Flask API。

所有的 URL 都是这样的:

@app.route("/my_function")

所以它在 my.host.com/my_function 的根路径上工作正常,但是当我输入 my.host.com/application1/my_function 时它不工作...

我刚刚将我的应用更改为

@app.route("/application1/my_function")

现在一切正常 :) 希望对您有所帮助!