但是,当我改用这个backendapi.default.svc.cluster.local:8080时,问题仍然存在。 我甚至尝试使用其内部映射到的另一个端口,但我的前端网页仍然说backendapi.default.svc.cluster.local:32208/api/v1/auth/login net :: ERR_NAME_NOT_RESOLVED。有趣的是,当我从我的前端pod进行卷曲时,它可以工作。 但是,当我使用网络浏览器访问时,它就不行了。
因为它只能在集群内解析。 (因为只有带有kube-dns插件的K8s集群才能将域名backendapi.default.svc.cluster.local:8080转换为相应的IP地址)
这可能是因为我也为服务公开了外部IP吗? 不,这是因为域名backendapi.default.svc.cluster.local只能在集群内解析,而不是从随机机器上的随机浏览器中解析。
解决方案
你所做的是其中一种解决方案,即为服务公开外部IP。 如果您不想使用该IP,则可以创建入口(并在集群中使用入口控制器)并公开您的微服务。 由于您在GCP上,因此可以利用其API网关,而不是公开加密的IP地址。
注意:请记住添加身份验证/授权以锁定您的微服务,因为它正在向用户公开。
另一个解决方案
通过为Web应用程序提供服务的服务器(nginx / nodejs等)代理所有后端调用
这种方法的优点是,您将避免所有同源策略/ CORS头痛,您的微服务(express)身份验证详细信息将从用户浏览器中抽象出来。 (这不一定是优势)。
这种方法的缺点是,您的后端微服务将与前端紧密耦合(或反之亦然,具体取决于您的看法),这将使后端扩展取决于前端。 您的后端未公开。 因此,如果您有另一个消费者(假设是Android应用程序),它将无法访问您的服务。
混合解决方案
通过为 Web 应用程序提供服务的服务器(如 nginx / nodejs 等)代理所有后端调用,以便您的 API 将继承您的 Web 应用程序域。并在需要时仍然公开后端服务(以便其他消费者(如果有)可以使用它)。
类似问题:
https://stackoverflow.com/a/47043871/6785908
http://service-name.namespace
,服务也可以在集群内访问。因此,对于我们的示例,它将是http://backendapi.default
。 - Jacek J