gpt4 book ai didi

Kubernetes 前端和后端之间的通信

转载 作者:行者123 更新时间:2023-12-03 08:26:30 33 4
gpt4 key购买 nike

对于本地开发,我有一个可以工作的 minikube。我们在那里部署了不同的服务。现在我想将前端与后端连接起来。

前端是一个 Angular 应用程序,并且存在于它自己的服务中。
后端是一个 node.js 应用程序,也使用单独的服务并使用 DNS 连接到其他内部服务,如 mongodb。

现在我想从前端与后端进行通信。 DNS 不工作,因为前端不知道如何解析命名路由。问题是告诉前端它应该使用哪个后端 URL 和端口来发送请求?

当我第一次使用类型 NodePort 启动后端服务并将 url 和端口复制到 Frontends 目标 URL 时,接近了唯一的工作状态。我认为这对我来说很不干净。是否有另一种方法可以将后端请求的 url 获取到前端?

我知道当我们在 type="LoadBalancer"的生产系统上部署服务时,该服务由外部 IP 公开,然后我可以从那里访问该服务。并且外部 IP 在 pod 更新等时将是永久的。我还看到的问题是后端 IP 需要通过额外的提交注入(inject)到 docker 容器中。

编辑(1):后端服务

apiVersion: v1
kind: Service
metadata:
name: backend
labels:
app: some-app
tier: backend
spec:
type: NodePort
ports:
- port: 3000
selector:
app: some-app
tier: backend

编辑(2):当我使用 fqn 从客户端请求时,我也会收到此响应:
OPTIONS http://backend.default.svc.cluster.local:3000/signup/ net::ERR_NAME_NOT_RESOLVED

最佳答案

首先,我将尝试解决您的具体问题

The only working state was approached when I first started the Backend service with type NodePort and copied the url and port to the Frontends target URL. I think this is very unclean to me. Is there another approach to get the url for backend requests into the Frontend?



您在这里有几个选择 1) 正如您所说,使用 type="LoadBalancer"。或 2) 通过前端服务器代理所有后端调用

I know when we deploy a service on a production system with type="LoadBalancer" that the service is exposed by an external IP and I can access the service then from there. And that the external IP will be permanent at pod updates and so on. The problem I also see is that the backend IP needs to be injected into the docker container by an additional commit.


  • 通过将配置从代码移到平台(比如 k8s configmap 或像 consul/eureka 这样的外部 KV 注册表),使它成为一个 12 因素应用程序(或者更接近 12 因素应用程序 :))
  • 即使它保留在代码中,如您所说,外部 IP 也是可引用的,除非您这样做,否则它不会改变。我不明白你为什么需要另一个部署

  • 通过前端服务器代理所有后端调用

    如果您正在通过前端的服务器端路由(或愿意路由)所有微服务/后端调用,并且如果将前端和后端部署在同一个命名空间中的同一个 k8s 集群中,那么您可以使用 KubeDNS 添加-on (如果它在您的 k8s 集群中尚不可用,您可以与 k8s 管理员联系)将后端服务名称解析为其 IP。从您的前端 服务器 , 您的后端服务将始终可以通过其名称解析。

    由于您的 k8s 集群中有 kubeDNS,并且前端和后端服务都驻留在同一个 k8s 集群和同一个命名空间中,我们可以利用 k8s 内置的服务发现机制。后端服务和前端服务将通过其名称相互发现。这意味着,您可以简单地使用 DNS 名称“backend”从您的前端 访问您的后端服务。 pod .因此,只需将所有后端请求通过您的前端 nginx 代理到您的上游后端服务。在前端 nginx pod ,后端服务的IP将解析为域名“后端”。这也将为您节省 CORS 头痛。此设置是可移植的,这意味着,无论您是在 dev、stage 或 prod 中部署,名称“backend”将始终解析为相应的后端。

    这种方法的一个潜在缺陷是,您的后端可能无法独立于前端进行扩展;在我看来,这没什么大不了的;在 k8s 环境中,如果需要,只需启动更多 pod。

    只是好奇-什么在为您的前端提供服务(哪种服务器技术将您的 index.html 传递给用户的浏览器)?是像 nginx 或 apache httpd 这样的静态服务器,还是你在这里使用 nodejs?

    关于Kubernetes 前端和后端之间的通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45165418/

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