【发布时间】:2017-12-23 05:47:20
【问题描述】:
对于本地开发,我有一个可以工作的 minikube。我们在那里部署了不同的服务。现在我想连接前端和后端。
前端是一个 Angular 应用程序,它存在于自己的服务中。 后端是一个 node.js 应用程序,也使用单独的服务并使用 DNS 连接到其他内部服务,如 mongodb。
现在我想从前端与后端进行通信。 DNS 不工作,因为前端不知道如何解析命名路由。问题是告诉前端它应该使用哪个后端 URL 和端口来发送请求?
当我第一次使用类型 NodePort 启动后端服务并将 url 和端口复制到前端目标 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
Edit(2):当我使用 fqn 从客户端请求时,我也会收到此响应:
OPTIONS http://backend.default.svc.cluster.local:3000/signup/ net::ERR_NAME_NOT_RESOLVED
【问题讨论】:
-
您是否使用服务公开了您的后端?如果是,您应该已经在服务定义中定义了端口,并且您应该获得 DNS 解析,例如 backend:80/<route>
-
@SebastienGoasguen 我已经添加了后端服务定义。所以我为后端定义了端口 3000,它也无法访问。我认为 Angular 应用程序不知道如何解析 dns 名称“后端”。
-
你能像这样
backend.default.svc.cluster.local尝试使用 fqn。您可能需要用您的名称空间替换默认值。 -
@sfgroups 遗憾的是,fqn 解决方案也不起作用。也许是一个愚蠢的问题。但是 url 必须以 http 之类的协议为前缀?
-
您最后的评论正是重点:前端(角度应用程序)在浏览器中运行,而浏览器很可能不在 k8s 集群内。所以使用服务名调用后端是行不通的。
标签: kubernetes