为什么Docker覆盖networking需要达成共识?

刚刚花了我的下午阅读Docker覆盖networking,非常酷的东西。 我似乎无法find一个答案。

根据文件:

  • 如果你安装和使用Docker Swarm,你会自动在你的pipe理者/工作者主机上获得覆盖networking,而不需要再configuration任何东西。 但是
  • 如果您只需要跨多个主机的(非Swarm)覆盖networking,则需要使用Consul或ZooKeeper等外部“KV Store”(一致服务器)configuration该networking

我想知道: 为什么?!? 显然,覆盖networking需要同行之间的共识,但我不确定为什么这些“同龄人”甚至是谁。

而我只是猜测 ,在Swarm中,有一些内部/底层共识服务器开箱即用。 是? 没有? 提前致谢!

Swarm模式使用Raft作为pipe理者与内置KV商店的共识。 在群集模式之前,可以通过第三方KV商店覆盖networking。 覆盖networking本身并不需要达成共识,只要依赖于KV商店所说的任何其他节点,甚至是它自己的本地状态(我已经发现这很难)。 通常,医pipe局的门店一般都设有医pipe局的共识。

KV商店跟踪IP分配给在每个主机上运行的容器(IPAM)。 这允许docker只分配给定的地址一次,并知道连接到另一个主机上运行的容器时,需要与哪个docker主机进行通信。 这需要来自任何一个docker主机的外部,最好是在HAconfiguration(如群集模式的共识),以便它可以继续工作,即使一些docker节点宕机。

docker节点之间的覆盖networking只涉及在该覆盖networking上具有容器的节点。 所以一旦IP被分配和发现,所有的通信只发生在具有相关容器的节点之间。 如果你创build一个networking,然后在一个工作者上列出networking,那么在群集模式下很容易看到,它不会在那里。 一旦该networking上的容器被安排,networking将出现。 从docker,这减less了多主机networking的开销,同时也增加了架构的安全性。 结果如下图所示:

Docker多主机网络

筏共识本身只是领导人选举所必需的。 一旦select一个节点作为领导,并且有足够的节点仍然有共识,那么只有一个节点正在写入KV存储并保持当前状态。 其他人都是追随者。 这个animation比我所能描述的更好 。

最后,您不需要设置外部KV商店来使用群集模式服务以外的覆盖networking。 您可以实施群集模式,使用--attachable选项configuration覆盖networking,并在该networking上以群集模式运行容器,就像使用外部KV存储一样。 过去,我使用这个过渡作为过渡状态来将容器转换为群集模式,其中一些使用docker-compose运行,另外一些则作为一个堆栈部署。

Interesting Posts