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 与 完全相同(name
和 run
除外)
我使用 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是否配置正确
平衡器配置。
如果问题仍然存在,请检查 Port、Nodeport 和 Targetport 正确配置或共享 '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")
现在一切正常 :) 希望对您有所帮助!
我尝试部署 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 与 完全相同(name
和 run
除外)
我使用 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是否配置正确 平衡器配置。
如果问题仍然存在,请检查 Port、Nodeport 和 Targetport 正确配置或共享 '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")
现在一切正常 :) 希望对您有所帮助!