Networking 为什么Docker覆盖网络需要共识?

Networking 为什么Docker覆盖网络需要共识?,networking,docker,docker-networking,consensus,gossip,Networking,Docker,Docker Networking,Consensus,Gossip,刚刚读了Docker overlay networks,很酷的东西。有一件事我似乎找不到答案 根据文件: 如果你安装并使用Docker Swarm,你可以自动在你的管理者/工作者主机上覆盖网络,不需要再配置任何东西但是 如果您只是想在多个主机之间建立一个(非Swarm)覆盖网络,则需要使用外部“KV存储”(共识服务器)配置该网络,如Concur或ZooKeeper 我想知道为什么会这样。显然,重叠网络需要同行之间达成共识,但我不确定这些“同行”到底是谁或为什么 我只是猜测,在Swarm中,有

刚刚读了Docker overlay networks,很酷的东西。有一件事我似乎找不到答案

根据文件:

  • 如果你安装并使用Docker Swarm,你可以自动在你的管理者/工作者主机上覆盖网络,不需要再配置任何东西但是
  • 如果您只是想在多个主机之间建立一个(非Swarm)覆盖网络,则需要使用外部“KV存储”(共识服务器)配置该网络,如Concur或ZooKeeper
我想知道为什么会这样。显然,重叠网络需要同行之间达成共识,但我不确定这些“同行”到底是谁或为什么


我只是猜测,在Swarm中,有一些内部/幕后共识服务器正在开箱即用。

Swarm模式使用Raft作为内置KV商店的管理者共识。在swarm模式之前,可以通过第三方KV商店进行覆盖联网。覆盖网络本身并不需要达成共识,它只依赖于KV存储所说的任何内容,而不管其他节点,甚至是它自己的本地状态(我已经很难找到了这个答案)。那里的KV存储通常是为HA设置的

KV存储跟踪每个主机(IPAM)上运行的容器的IP分配。这允许docker只分配一次给定的地址,并在连接到另一台主机上运行的容器时知道需要与哪个docker主机通信。这需要来自任何一个docker主机的外部,最好是在HA配置中(如swarm mode的consensus),以便即使某些docker节点停机,它也可以继续工作

docker节点之间的覆盖网络仅涉及在该覆盖网络上具有容器的节点。因此,一旦IP被分配和发现,所有的通信只发生在具有相关容器的节点之间。这在swarm模式下很容易看到,如果你创建一个网络,然后在一个worker上列出网络,它就不在那里了。一旦该网络上的容器被调度,网络就会出现。从docker来看,这减少了多主机联网的开销,同时也增加了体系结构的安全性。结果如下图所示:

只有领导人选举才需要达成共识。一旦选择一个节点作为领导者,并且有足够多的节点保持一致,则只有一个节点正在写入KV存储并保持当前状态。其他人都是追随者


最后,您不需要设置外部KV存储来使用swarm模式服务之外的覆盖网络。您可以实现swarm模式,使用
--attachable
选项配置覆盖网络,并在该网络上运行swarm模式之外的容器,就像使用外部存储一样。我过去曾将此作为一种过渡状态,将容器置于swarm模式,其中一些容器使用docker compose运行,其他容器部署为swarm堆栈。

一般来说,对等节点是您覆盖的节点,不是吗?可能是节点、容器或FlibLabs,这就是我提出此问题的原因。谢谢@BMitch(+1)-你在DIY.SE帮了我无数次,没想到你是码头工人,该死!除了中间的两段,你说的每句话对我来说都是有道理的。我想我听说在这个共识等式中,只有承载具有覆盖网络的容器的Docker主机才被视为成员(是吗?)。如果是这样的话,那么这些“具有覆盖节点的托管容器”中的每一个都构成了成员/对等方,并且它们都共享关于哪些容器具有哪些IP地址的信息……并且领导者是通过Raft选出的这些节点中的任何一个。而且,当DNS将容器名称解析为覆盖层内的IP时,领先者是幸运的赢家,他会得到有关此信息的咨询。如果引线向下,则任何其他节点都可以成为引线。我对你们的理解正确吗?还是我在左外野的距离太远了?再次感谢@斯梅布你的问题让我意识到我没有澄清一个重要的问题。据我所知,覆盖层本身并没有共识,它只是将千伏视为真相的来源,由你们来为HA实现千伏共识。覆盖网络中的节点将网络的所有知识委托给该KV,以避免IP冲突和其他问题。我也在筏子上添加了一个链接,希望能对你们有所帮助。筏形的一致性和覆盖的设计是两个不同的主题。