服务发现已经存在了一段时间(基本上,只要是分布式系统就需要服务发现)。 在容器环境中,服务发现的挑战归结为可靠地维护正在运行的容器与其位置之间的映射。容器的IP地址和可到达它的端口就是容器的位置。这种映射必须及时并准确地贯穿整个集群的容器的生命周期,包括重新启动。容器的服务发现需要解决如下两类问题:
-
注册
建立
容器-->位置
映射。 因为只有调度容器的scheduler知道容器的位置,我们可以认为scheduler是有关容器位置的绝对真实的来源。 -
查找
使其他服务或应用程序能够查找我们在注册阶段中存储的映射关系。有趣的属性包括信息的新鲜度和查询的延迟(avg,p50,p90等)。
让我们来看看查找阶段一些值得考虑的问题:
-
如何排除不健康的主机或从查找路径中挂起容器?而不是简单地向某个方向发送请求。这同时也是跟负载平衡强烈相关话题,因为它非常重要,我们将在本章的最后一节详细讨论。
-
服务发现具体实现中如何实现强一致性与高可用性。有人认为这是一个实现细节,有的人则认为CAP定理所要求的。
-
可伸缩性也是需要考虑的问题。当然,如果你的集群规模很小,那么这里讨论的所有解决方案都是合适的。但是,如果您的群集有几百甚至几千个节点,那么在您承诺使用某项特定技术之前,您需要确保进行了适当的负载测试。
在本章中,您将了解服务发现方案的选择,在何处使用它们,怎样使用它们。
如果您想了解更多关于这个领域的需求和基本挑战,请阅读Jeff Lindsay的“Docker环境下的现代服务发现”,并查看Shopify的Simon Eskildsen在最近的DockerCon上对此主题的看法。