我对kubernetes相当陌生,并且已经在Google容器引擎上成功设置了集群。在我的集群中,我有一个用dropwizard开发的后端api,用node js和mysql数据库开发的前端api。所有这些都已经部署到集群并且可以正常工作。但是,在为节点容器和后端设置外部ip之后,我面临的挑战是,我可以远程访问它们,但是无法使用服务名称从前端访问后端我的后端在集群中称为backendapi。我不能这样做http:// backendapi:8080部署到群集时调用我的其余服务。对我来说,难点是当我部署到群集时,我不希望前端使用外部ip攻击后端,我希望它们无需通过外部ip地址即可在群集内进行连接。当我连接到Pod并ping backendapi时,它返回一个结果,但是当我部署前端并使用标签名称时,它不起作用。我该怎么办?
但是当我更改为这个 backendapi.default.svc.cluster.local:8080 时,问题仍然存在。我什至尝试使用它在内部映射到的其他端口,但我的前端网页一直显示 backendapi.default.svc.cluster.local:32208/api/v1/auth/login net::ERR_NAME_NOT_RESOLVED。有趣的是,当我从前端吊舱卷曲时,它就起作用了。但是当我使用网络浏览器访问它时却没有
因为它只能在集群内解析。(因为只有带有 kube-dns 插件的 K8s 集群才能将域名 backendapi.default.svc.cluster.local:8080 转换为对应的 IP 地址)
这可能是因为我也暴露了该服务的外部 IP。外网ip还是可以用的
不,这是因为域名 backendapi.default.svc.cluster.local 只能在集群内解析,不能从随机机器中的随机浏览器解析。
您所做的是解决方案之一,为服务公开外部 IP。如果您不想使用该 IP,则可以创建一个入口(并在集群中使用入口控制器)并公开您的微服务。由于您在 GCP 上,因此您可以使用他们的 API 网关,而不必暴露神秘的 IP 地址。
注意:请记住添加身份验证/授权以锁定您的微服务,因为它会暴露给用户。
通过为您的 Web 应用程序提供服务的服务器(nginx/nodejs 等)代理所有后端调用
这种方法的优点是,您将避免所有同源策略/CORS 令人头痛的问题,您的微服务(快速)身份验证详细信息将从用户的浏览器中抽象出来。(这不一定是优势)。
这种方法的缺点是,您的后端微服务将与前端紧密耦合(反之亦然,具体取决于您如何看待它),这将使后端的扩展依赖于前端。您的后端没有暴露。因此,如果您有另一个消费者(我们只说一个 Android 应用程序),它将无法访问您的服务。
通过为您的 Web 应用程序(nginx/nodejs 等)提供服务的服务器代理所有后端调用,以便您的 API 将继承您的 webapps 域。并且仍然公开后端服务(在需要时),以便其他消费者(如果将来有的话)可以使用它。
类似的问题:/sf/answers/3293071001/
只要kube-dns正在运行(我相信它始终是“除非您禁用它”),所有Service对象的群集 DNS名称都为in,service_name +"."+ service_namespace + ".svc.cluster.local"因此所有其他内容都将backendapi在default名称空间中以您的身份来使用(使用端口号示例)http://backendapi.default.svc.cluster.local:8080。这就是Kubernetes强制所有标识符都是“ dns兼容”名称(没有下划线或其他愚蠢字符)的原因。
即使您没有运行kube-dns,也像 docker一样将所有服务名称和端口也注入Pods环境,因此环境变量${BACKENDAPI_SERVICE_HOST}:${BACKENDAPI_SERVICE_PORT}将包含服务的群集内IP(即使env-var被命名为如果只有一个,则为“主机”)和“默认”服务端口(在您的示例中为8080)。
是否选择使用DNS名称或环境变量IP,取决于您是否喜欢在日志输出或错误消息中为事物使用“可读”名称,而不是希望跳过DNS查找并使用服务IP地址,但速度较快,可读性较差。它们的行为相同。
整个故事都存在于服务网络概念文档中
| 归档时间: |
|
| 查看次数: |
5120 次 |
| 最近记录: |