找出dockerized Consul服务的IP地址

时间:2019-06-01 09:03:56

标签: docker kubernetes consul

我正在构建基于微服务的应用程序,并希望将Consul用作服务注册表。总而言之,我有以下三种情况:

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

现在,我遇到了如何使用其IP地址注册服务的问题,因为我需要弄清楚它们的IP地址,以便领事可以访问(例如,进行健康检查):

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

我该如何解决这些问题?

PS:我想避免使用诸如Gliderlabs的registrator之类的容器,因为我怀疑它在Kubernetes上的工作情况如何,而且对于混合Docker /主机方案也无济于事。 / p>

1 个答案:

答案 0 :(得分:1)

如果您正在使用Kubernetes,则可以先检查其built-in service registry是否满足您的需求。通常,没有通过节点主机IP地址到达Pod的直接路径,因此您描述的设置不能很好地工作。 (我可能会考虑将Consul用于键/值存储,但作为Kubernetes领域中的服务注册中心,我将无法获得它。)

在普通的多主机Docker领域,这是我发现适合主机网络的少数情况之一。使用--net host或Docker Compose或其他编排工具中的等效选项启动Consul。然后Consul会认为“其” IP地址是主机的IP地址,如果您对知名端口进行了自动TCP探测,则可以搜索主机上运行的每个服务,并在其中找到 eg 一个MySQL服务。端口3306,无论是在容器中运行还是在主机上本地运行。

使用此设置,servicename.service.consul将解析为某个物理主机IP地址。如果您有一个Docker容器指向其当前用于DNS服务的主机,那么它将把服务路由到某个主机,也许是同一主机,但这在过去对我来说确实可靠。

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