我正在构建基于微服务的应用程序,并希望将Consul用作服务注册表。总而言之,我有以下三种情况:
现在,我遇到了如何使用其IP地址注册服务的问题,因为我需要弄清楚它们的IP地址,以便领事可以访问(例如,进行健康检查):
127.0.0.1
,就可以完成。hostname -i
来确定其外部IP并将其移交给Consul。这可行,但是我想知道是否有更好的方法来解决这个问题? (理想情况下,该解决方案在Kubernetes上也应以相同的方式工作。)host.docker.internal
)。但是首先,这从外部不起作用,其次它仅适用于Mac / Windows的Docker,而不是例如Kubernetes。我该如何解决这些问题?
PS:我想避免使用诸如Gliderlabs的registrator
之类的容器,因为我怀疑它在Kubernetes上的工作情况如何,而且对于混合Docker /主机方案也无济于事。 / p>
答案 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
在开发人员桌面环境中。您需要确保可配置,最直接的方法是通过环境变量。