问题:docker engine swarm mode需要服务发现

我对 docker swarm 感到困惑。据我所知,运行 swarm 的旧方法是在 docker 引擎提供对 swarm 模式的本机支持之前,在容器中运行 manager 和 workers。旧的容器化 swarm 的文档解释了如何使用 consul、etcd 或 zookeeper 设置服务发现。服务发现是必要的,因为服务在随机端口上运行以避免冲突,对吗?

docker engine swarm mode 的文档没有解释如何设置服务发现。现在我很困惑,如果该机制包含在 swarm 模式中,或者文档不完整。

我在哪里可以找到关于 swarm 模式的清晰、最新的解释,以及它与服务发现等概念的关系?

解答

虽然@MagicMicky 给出的答案是正确的,但我将尝试添加更多关于 Swarm Legacy 和 Swarm Mode 之间关于服务发现的区别的上下文:

注意:我将 Swarm 的第一个版本称为 Swarm legacy,将新版本称为 Swarm mode

使用 Swarm Legacy 进行服务发现

使用 Swarm Legacy,您必须部署自己的 ZookeeperConsulEtcd 来管理集群拓扑,这意味着节点被分配为集群中的代理。这些分布式键/值存储用于健康监控和分布式锁定目的。 Swarm 没有使用这些来管理服务发现,而只是 集群节点发现和监控

如果您希望通过 Swarm 为您的容器部署服务发现,例如,您必须设置一个外部 Consul/Registrator/DNS 并在这些解决方案上注册您的服务。我想到的一个专门为 Swarm 构建的系统的例子是Wagl。

使用更高版本的 docker 引擎 (1.11),您还可以在创建覆盖网络并将容器分配给覆盖网络时访问内置 DNS。在1.11之前,服务发现的(有争议的)机制是通过/etc/hosts追加服务条目。

在任何情况下,覆盖网络都没有直接包含在 Swarm 中,这是一个需要自己设置的单独组件。它更像是一个“附加组件”。

一般来说,第一版 Swarm 背后的“理念”是提供一些简单可靠的东西来管理跨主机的容器,如果你需要添加更多功能,例如服务发现或负载平衡,你必须自己动手。


使用 Docker Swarm 模式进行服务发现

从 Docker 开始,1.12服务发现通过 Swarm 模式 直接包含在 docker 中,并带有 embedded DNS 和 Load Balancer。这意味着不再需要外部组件来管理服务发现和负载平衡。

当您创建服务并将其分配给覆盖时,它的 DNS 名称将被注册,并且覆盖的其他服务部分可以通过其服务名称访问它。使用内置 LB 对服务运行的任务进行适当的负载平衡。

对于 Swarm 模式,“理念”更多的是包括开箱即用的一切(证书管理和轮换、服务发现、负载平衡、通过内置数据存储的集群元数据、网络、调度),以确保您拥有最完整的从第一天开始就可以使用系统。如果需要,您仍然可以交换和更换一些组件。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐