Ingress 和 Angular with namespaces - 如何在不更改 url 的情况下通过 ingress 重新路由到正确的命名空间

Ingress and Angular with namespaces- how to reroute to correct namespace through ingress without changing url

我目前正在构建一个带有 angular 应用程序和 express 后端的 K8s 集群。

集群应该被分成两个命名空间,test 和 prod,每个 ns 中来自前端的请求将转到相应的后端应用程序。因为 angular 在浏览器中运行,我目前正在通过外部入口从 angular 应用程序向后端发送请求,但是由于 angular 环境变量是在构建时设置的,我无法指定prod 和 test 的 backendUrls 不同,因此无论它们来自哪个命名空间,请求都会发送到相同的 url。

我看到一些人解释说 angular 无法在内部到达后端,但找不到任何关于如何整理命名空间路由的信息。有没有办法让入口知道请求来自哪里并相应地重新路由?或者用其他方法解决这个问题。

我的命名空间设置如下:

apiVersion: v1
kind: Namespace
metadata:
  name: test
---
apiVersion: v1
kind: Namespace
metadata:
  name: prod

并且入口在 prod 命名空间上设置如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/use-regex: "true"
  name: ingress-service
  namespace: prod
spec:
  ingressClassName: nginx
  rules:
    - host: prod.mysite.com
      http:
        paths:
          - backend:
              service:
                name: dashboard-service
                port:
                  number: 8081
            path: /?(.*)
            pathType: Prefix
          - backend:
              service:
                name: backend-service
                port:
                  number: 3000
            path: /api/?(.*)
            pathType: Prefix

在测试命名空间上,它是相同的,但主机:test.mysite.com 和命名空间:prod。在每个命名空间中,都有一个仪表板应用程序和一个带有服务的后端应用程序。

我目前 运行 在 minikube 上使用它,但我预计当它部署在 AWS 上时问题会继续存在。

非常感谢您提供的任何帮助!

你基本上有三个选择:

  • 不要在 angular 应用程序中使用完整的 URL,当从 [=22] 的不同 URL 加载时,只需使用 /api/ =].com/test.mysite.com 相对路径将附加到域并解决您的问题
  • 您可以通过检查主机名 and/or 端口
  • 动态确定 Angular 中的后端 url
  • 您可以创建一个 docker 图像来更改 api url 使用入口点和环境变量 index.html 中定义的值