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

时间:2017-06-14 19:45:13

标签: networking docker docker-networking consensus gossip

刚刚阅读了Docker覆盖网络,非常酷的东西。我似乎无法找到答案。

根据文件:

  • 如果您安装并使用Docker Swarm,您可以自动在您的经理/工作人员主机上获得覆盖网络,而无需再配置任何内容;的 ...
  • 如果您只想在多个主机上使用(非Swarm)覆盖网络,则需要使用外部“KV Store”(共识服务器)(如Consul或ZooKeeper)配置该网络

我想知道为什么会这样。很明显,覆盖网络需要在同行之间达成共识,但我不确定为什么或那些“同伴”甚至是谁。

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

1 个答案:

答案 0 :(得分:4)

Swarm模式使用Raft为其经理与内置KV商店达成共识。在群集模式之前,第三方KV商店可以实现覆盖网络。覆盖网络本身并不需要达成共识,它只依赖于KV商店所说的,无论其他节点如何,甚至是它自己的本地状态(我已经找到了困难的方式)。 KV存储通常设置为HA的共识。

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

Docker节点之间的覆盖网络仅涉及该覆盖网络上具有容器的节点。因此,一旦分配和发现IP,所有通信仅在具有相关容器的节点之间发生。如果您创建一个网络,然后在工作人员上列出网络,那么使用群集模式很容易看到,它不会在那里。一旦该网络上的容器被安排,网络就会出现。从docker,这可以减少多主机网络的开销,同时还可以增加架构的安全性。结果如下图所示:

Docker multi-host networking

只有领导人选举才需要筏共识本身。一旦选择节点作为领导者并且剩余足够的节点达成共识,则只有一个节点正在写入KV存储并保持当前状态。其他人都是追随者。 This animation describes it better than I ever could

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