Kubernetes前端和后端之间的通信

Lun*_*ero 9 kubernetes

对于本地开发,我有一个工作的迷你管.我们部署了不同的服务.现在我想将前端与后端连接起来.

前端是一个有棱有角的应用程序,并以自己的服务为生.后端是一个node.js应用程序,它也使用单独的服务,并使用DNS连接到其他内部服务,如mongodb.

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

当我第一次使用NodePort类型启动Backend服务并将url和端口复制到Frontends目标URL时,接近了唯一的工作状态.我觉得这对我来说非常不洁净.是否有另一种方法可以将后端请求的URL添加到前端?

我知道当我们在具有type ="LoadBalancer"的生产系统上部署服务时,该服务是由外部IP公开的,然后我可以从那里访问该服务.并且外部IP将在pod更新等方面永久保留.我还看到的问题是后端IP需要通过额外的提交注入到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
Run Code Online (Sandbox Code Playgroud)

编辑(2):当我从客户端请求fqn时,我也得到了这个响应:

OPTIONS http://backend.default.svc.cluster.local:3000/signup/ net::ERR_NAME_NOT_RESOLVED
Run Code Online (Sandbox Code Playgroud)

so-*_*ude 8

首先,我将尝试解决您的特定问题

当我首次使用NodePort类型启动Backend服务并将URL和端口复制到Frontends目标URL时,进入了唯一的工作状态。我觉得这对我来说很不干净。是否有另一种方法可以将后端请求的网址发送到前端?

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

我知道当我们在类型为“ LoadBalancer”的生产系统上部署服务时,该服务由外部IP公开,然后可以从那里访问该服务。并且外部IP将在Pod更新时永久存在,依此类推。我还看到的问题是,后端IP需要通过其他提交注入到Docker容器中。

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

通过前端服务器代理您所有的后端呼叫

如果要通过前端服务器端路由(或愿意路由)所有微服务/后端调用,并且要将前端和后端都部署在相同名称空间的同一k8s集群中,则可以使用KubeDNS add -on(如果k8s群集中尚不可用,则可以与k8s管理员联系)将后端服务名称解析为其IP。在您的前端服务器上,您的后端服务将始终可以通过其名称进行解析。

由于您的k8s群集中有kubeDNS,并且前端和后端服务都位于相同的k8s群集和相同的名称空间中,因此我们可以利用k8s的内置服务发现机制。后端服务和前端服务可以通过名称相互发现。这意味着,您可以简单地使用DNS名称“后端”从前端pod到达后端服务。因此,只需将所有后端请求通过您的前端nginx代理到您的上游后端服务即可。在前端nginx pod中,可以将域名“ backend”解析为后端服务的IP。这也将使您避免CORS头痛。此设置是可移植的,这意味着无论您是在开发阶段还是阶段还是产品中进行部署,都将其命名为“后端”

这种方法的潜在陷阱是,您的后端可能无法独立于前端进行扩展。在我拙见中,这没什么大不了的。在k8s环境中,如果需要,只需旋转更多的Pod。

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