【问题标题】:Connecting Frontend and Backend in Kubernetes在 Kubernetes 中连接前端和后端
【发布时间】:2021-01-18 01:09:28
【问题描述】:

我的前端设置为:

this.http.post<any>(`${environment.apiUrl}/auth/login`, {email, password})

在哪里apiUrl: 'http://backend/api'

我在一个容器中构建了前端并将其暴露给负载均衡器服务,我试图通过 ClusterIP 服务将它连接到端口 3000 上的后端。

前端 YAML:

apiVersion: v1
kind: Service
metadata:
  name: frontend
spec:
  selector:
    tier: frontend
  ports:
    - port: 80
      targetPort: 80
  type: LoadBalancer
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend
spec:
  selector:
    matchLabels:
      tier: frontend
  replicas: 1
  template:
    metadata:
      labels:
        tier: frontend
    spec:
      containers:
      - name: frontend
        image: <Image>
        imagePullPolicy: Always
        ports:
        - containerPort: 80

后端 YAML:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: backend
spec:
  selector:
    matchLabels:
      app: app
      tier: backend
  replicas: 1
  template:
    metadata:
      labels:
        app: app
        tier: backend
    spec:
      containers:
      - name: frontend-container
        image: <Image>
        ports:
        - containerPort: 3000
---
apiVersion: v1
kind: Service
metadata:
  name: backend
spec:
  selector:
    app: app
    tier: backend
  ports:
  - protocol: TCP
    port: 80
    targetPort: 3000

如文档 here 中所述。

但是当我尝试从浏览器访问它时它不起作用,我收到未知错误!

这里是前端内部的屏幕截图,确保它能够在内部到达后端。

我不明白我在哪里出错了。我认为设置为 http://backend 的 apiUrl var 未正确转换,因为如果我将其更改为负载均衡器 IP 并重建映像,则将后端暴露给 LB 服务而不是 ClusterIP。它确实有效。

但显然我不想将我的后端暴露给 LB 服务。

有什么想法吗?

【问题讨论】:

  • 你试过用Ingress吗?
  • 是的,我在前面使用了 Ingress:Traffic > Ingress (IP) > Route to Frontend Service LB > ClusterIP Service > Backend

标签: node.js kubernetes


【解决方案1】:

看下面:

outside world  | k8s cluster
               | 
Browser  -->   | Nginx-pod --> backend-pod
               |
               |

urlhttp://backend/api只能在集群内解析,但是你的浏览器在外面,所以不知道这个url是什么。

您最好使用ingress 来管理集群 pod 的路由。

【讨论】:

  • 是否需要制作 Ignress?有例子linklink集群中的后端和前端通过nginx反向代理配置连接。我做了这样的例子,但它抛出了 404。有问题,但没有人知道link
  • 对于生产用例,您可以使用ingress。对于临时部署,您可以在 nginx 中配置配置,并通过 NodePort 公开 nginx
【解决方案2】:

正如@Elgarni 所说,客户端的浏览器无法访问您的集群,因此http://backend/api 在集群外部无法解析。
如果您定义了入口,请使用kubectl get ingress 命令并了解您的外部 IP。然后将您的 ${environment.apiUrl} 替换为 http://$EXTERNAL_IP/api/ 或 为您的外部 IP 定义 DNS 记录并通过您定义的域进行访问。

【讨论】:

    猜你喜欢
    • 2021-02-10
    • 2019-07-19
    • 1970-01-01
    • 2021-07-06
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 2022-10-06
    相关资源
    最近更新 更多