为 dockerized Consul 找出服务的 IP 地址

Figuring out the IP address of a service for dockerized Consul

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

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

我该如何解决这些问题?

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

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

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

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

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