为 dockerized Consul 找出服务的 IP 地址

戈洛·罗登

我正在构建一个基于微服务的应用程序,并希望使用 Consul 作为服务注册中心。总而言之,我有三种情况:

  • 所有服务都在主机上运行。
  • 所有的服务都在主机上运行,​​但是 Consul 在 Docker 中运行。
  • 所有的服务和 Consul 都在 Docker 中运行。

现在我遇到了如何使用他们的 IP 地址注册服务的问题,因为我需要找出他们的 IP 地址,以便 Consul 可以访问它(例如,用于健康检查):

  • 如果所有内容都在同一主机上运行,​​则非常简单:只需使用127.0.0.1,即可完成。
  • 如果一切(包括 Consul)都在 Docker 中运行,我可以hostname -i从 Docker 容器中使用来找出它们的外部 IP 并将其交给 Consul。这有效,但我想知道是否有更好的方法来解决这个问题?(理想情况下,该解决方案也应该在 Kubernetes 上以相同的方式工作。)
  • 如果服务在主机上运行,​​但 Consul 在 Docker 中运行,那么现在我根本没有任何想法。基本上,Consul 需要主机的 IP 地址才能与服务通信,但我只能从 Consul 容器中检测到这一点(通过解析host.docker.internal)。但是首先,这在外部不起作用,其次它仅适用于 Mac / Windows 的 Docker,例如不适用于 Kubernetes。

我该如何解决这些问题?

PS:我想避免使用registratorGliderlabs 之类的容器,因为我怀疑它在 Kubernetes 上的效果如何,而且它对混合 Docker / 主机场景也无济于事。

大卫迷宫

如果您正在使用 Kubernetes,您可能首先要检查其内置的服务注册表是否满足您的需求。通常没有通过其节点主机的 IP 地址到达 pod 的直接路径,因此您描述的设置不会真正有效。(我可能会考虑将 Consul 用于键/值存储,但我不会将其作为 Kubernetes 领域中的服务注册表。)

在普通的多主机 Docker 领域,这是我发现适合主机网络的少数情况之一。使用--net hostDocker Compose 或其他编排工具中的或等效选项启动 Consul 然后,Consul 会相信“它的”IP 地址是主机的,如果你有已知端口的自动 TCP 探测,你可以搜索主机上运行的每个服务并发现例如端口 3306 上的 MySQL 服务,无论是否运行在一个容器或本机在主机上。

通过此设置,servicename.service.consul将解析为某个物理主机 IP 地址。如果您有一个 Docker 容器指向其当前主机以获取 DNS 服务,那么这会将服务路由到某个主机,可能是同一台主机,但这在过去对我来说很可靠。

请注意,相关主机名在不同环境中会有所不同:servicename.service.consul对于基于 Consul 的设置,servicename.namespacename.svc.cluster.local在 Kubernetes 中,可能localhost在开发人员桌面环境中。您需要确保这是可配置的,最直接的是通过环境变量。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章