gpt4 book ai didi

Kubernetes-Ingress:如何使用 HTTPS 正确路由到两个服务?

转载 作者:行者123 更新时间:2023-12-02 12:15:44 25 4
gpt4 key购买 nike

我正在尝试通过 Kubernetes 部署一个 ReactJs 应用程序和一个 Express-GraphQL 服务器。但是我在设置入口以将流量路由到这两个服务时遇到了麻烦。具体来说,我无法再到达我的后端。

当我将 React 前端和 Express 后端作为单独的服务并公开它们时,它运行良好。但现在我正在尝试启用 HTTPS 和 DNS。并通过 Ingress 路由到他们两个。

这是我的服务 yaml 文件

apiVersion: v1
kind: Service
metadata:
name: bpmclient
namespace: default
spec:
ports:
- port: 80
protocol: TCP
targetPort: 5000
selector:
run: bpmclient
type: NodePort
apiVersion: v1
kind: Service
metadata:
name: bpmserver
namespace: default
spec:
ports:
- port: 3090
protocol: TCP
targetPort: 3090
selector:
run: bpmserver
type: NodePort

和我的入口...
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: bpm-nginx
annotations:
kubernetes.io/ingress.global-static-ip-name: bpm-ip
networking.gke.io/managed-certificates: bpmclient-cert
ingress.kubernetes.io/enable-cors: "true"
ingress.kubernetes.io/cors-allow-origin: "https://example.com"
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: example.com
http:
paths:
- path: /v2/*
backend:
serviceName: bpmserver
servicePort: 3090
- path: /*
backend:
serviceName: bpmclient
servicePort: 80


通过此设置,我已经能够使用 https 成功访问客户端。但是我无法再通过客户端或浏览它来访问我的后端。我收到 502 服务器错误。但是我检查了后端 pod 的日志,除了 404 日志之外什么也没看到。

我的前端通过 example.com/v2/graphql 到达后端。当我在我的机器上本地运行它时,我会转到 localhost:3090/graphql。因此,如果路由正确完成,我不明白为什么会收到 404。

最佳答案

我在这里看到一些可能是错误的事情:

  • Ingress 对象应该在与其路由的服务相同的命名空间中创建。我看到你指定了namespace: default在您服务的 yamls 中,但不在 Ingress 中。
  • 我不知道您使用的是哪个版本的 Ingress,但符合 documentation 0.22.0后

  • ingress definitions using the annotation nginx.ingress.kubernetes.io/rewrite-target are not backwards compatible with previous versions. In Version 0.22.0 and beyond, any substrings within the request URI that need to be passed to the rewritten path must explicitly be defined in a capture group.


  • path:应该嵌套在 backend: 之后和捕获组应添加到 nginx.ingress.kubernetes.io/rewrite-target: /在数字占位符中,例如 $1

  • 所以你应该尝试这样的事情:
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
    name: bpm-nginx
    namespace: default
    annotations:
    kubernetes.io/ingress.global-static-ip-name: bpm-ip
    networking.gke.io/managed-certificates: bpmclient-cert
    ingress.kubernetes.io/enable-cors: "true"
    ingress.kubernetes.io/cors-allow-origin: "https://example.com"
    nginx.ingress.kubernetes.io/rewrite-target: /$1
    spec:
    rules:
    - host: example.com
    http:
    paths:
    - backend:
    serviceName: bpmserver
    servicePort: 3090
    path: /v2/?(.*)
    - backend:
    serviceName: bpmclient
    servicePort: 80
    path: /?(.*)

    请让我知道这是否有帮助。

    关于Kubernetes-Ingress:如何使用 HTTPS 正确路由到两个服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56721497/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com