1

我尝试部署 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完全相同(除了nameand run

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

入口.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.

为什么根工作而不是另一个?

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

谢谢你的帮助 !

编辑:

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

404

不知道它是否有帮助,但这也是显示 404 的 Ingress 访问日志的一部分

日志

4

3 回答 3

0

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

来自文档:

NodePort:在静态端口(NodePort)上公开每个节点 IP 上的服务。自动创建 NodePort 服务路由到的 ClusterIP 服务。您可以通过请求从集群外部联系 NodePort 服务:。

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

于 2021-07-14T17:48:39.290 回答
0
于 2021-07-16T10:42:54.757 回答
0

回答我自己的问题:

经过几天的搜索,我最终找到了问题的原因。

集群和配置一切都很好,我的问题来自我的 Flask API。

所有的 URL 都是这样的:

@app.route("/my_function")

所以它在根路径上运行良好my.host.com/my_function,但是当我打字时my.host.com/application1/my_function它不起作用......

我刚刚将我的应用程序更改为

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

现在一切正常:) 希望它会有所帮助!

于 2021-07-20T16:10:14.220 回答