为 dockerized Consul 找出服务的 IP 地址
Figuring out the IP address of a service for dockerized Consul
我正在构建一个基于微服务的应用程序,并且想使用 Consul 作为服务注册表。总而言之,我有三种情况:
- 主机上的所有服务运行。
- 主机上的所有服务 运行,但 Docker 中的 Consul 运行。
- Docker.
中的所有服务和 Consul 运行
现在我遇到了如何使用他们的 IP 地址注册服务的问题,因为我需要弄清楚他们的 IP 地址以便 Consul 可以访问它(例如,进行健康检查):
- 如果所有内容 运行 都在同一台主机上,这很简单:只需使用
127.0.0.1
,就大功告成了。
- 如果 Docker 中的所有内容(包括 Consul)运行,我可以使用 Docker 容器中的
hostname -i
来找出它们的外部 IP 并将其交给交给领事。这行得通,但我想知道是否有更好的方法来解决这个问题? (理想情况下,该解决方案在 Kubernetes 上也应该以相同的方式工作。)
- 如果服务 运行 在主机上,但 Consul 运行 在 Docker 中,现在我完全没有任何想法。基本上,Consul 需要主机的 IP 地址才能与服务对话,但我只能从 Consul 容器内检测到这一点(通过解析
host.docker.internal
)。但首先,这在外部不起作用,其次它仅适用于 Docker for Mac / Windows,例如使用 Kubernetes。
我该如何解决这些问题?
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 环境。您需要确保这是可配置的,最直接的方式是通过环境变量。
我正在构建一个基于微服务的应用程序,并且想使用 Consul 作为服务注册表。总而言之,我有三种情况:
- 主机上的所有服务运行。
- 主机上的所有服务 运行,但 Docker 中的 Consul 运行。
- Docker. 中的所有服务和 Consul 运行
现在我遇到了如何使用他们的 IP 地址注册服务的问题,因为我需要弄清楚他们的 IP 地址以便 Consul 可以访问它(例如,进行健康检查):
- 如果所有内容 运行 都在同一台主机上,这很简单:只需使用
127.0.0.1
,就大功告成了。 - 如果 Docker 中的所有内容(包括 Consul)运行,我可以使用 Docker 容器中的
hostname -i
来找出它们的外部 IP 并将其交给交给领事。这行得通,但我想知道是否有更好的方法来解决这个问题? (理想情况下,该解决方案在 Kubernetes 上也应该以相同的方式工作。) - 如果服务 运行 在主机上,但 Consul 运行 在 Docker 中,现在我完全没有任何想法。基本上,Consul 需要主机的 IP 地址才能与服务对话,但我只能从 Consul 容器内检测到这一点(通过解析
host.docker.internal
)。但首先,这在外部不起作用,其次它仅适用于 Docker for Mac / Windows,例如使用 Kubernetes。
我该如何解决这些问题?
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 环境。您需要确保这是可配置的,最直接的方式是通过环境变量。