【问题标题】:Kubernetes-Ingress: How do I properly route to two services with HTTPS?Kubernetes-Ingress:如何使用 HTTPS 正确路由到两个服务?
【发布时间】:2019-06-23 06:15:57
【问题描述】:

我正在尝试通过 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

还有我的 Ingress...

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。

【问题讨论】:

    标签: kubernetes kubernetes-ingress


    【解决方案1】:

    我在这里看到了一些可能有问题的地方:

    1. 应在与其路由的服务相同的命名空间中创建入口对象。我看到您在服务的 yaml 中指定了 namespace: default,但在 Ingress 中没有指定。

    2. 我不知道你使用的是哪个版本的 Ingress,但在 0.22.0 之后符合 documentation

    使用注解的入口定义 nginx.ingress.kubernetes.io/rewrite-target 不倒退 与以前的版本兼容。在 0.22.0 及更高版本中,任何 请求 URI 中需要传递给 重写路径必须在捕获组中明确定义。

    1. 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: /?(.*)
    

    如果有帮助,请告诉我。

    【讨论】:

      猜你喜欢
      • 2020-03-13
      • 1970-01-01
      • 2021-12-03
      • 2023-03-18
      • 1970-01-01
      • 2018-03-04
      • 1970-01-01
      • 2021-11-11
      • 2022-01-08
      相关资源
      最近更新 更多