Swarm Mode 使用 Raft 作为其管理器共识和内置的 KV 存储。在 Swarm 模式之前,可以与第三方 KV 存储进行覆盖网络。覆盖网络本身不需要共识,它只依赖于 KV 存储所说的任何内容,而不管其他节点甚至它自己的本地状态(我已经很难找到这一点)。那里的 KV 存储通常设置为 HA 共识。
KV 存储跟踪每个主机 (IPAM) 上运行的容器的 IP 分配。这允许 docker 只分配给定地址一次,并且当您连接到在另一台主机上运行的容器时,它知道它需要与哪个 docker 主机通信。这需要在任何一个 docker 主机外部,并且最好在 HA 配置中(如 swarm 模式的共识),以便即使在某些 docker 节点关闭时它也可以继续工作。
docker 节点之间的覆盖网络仅涉及在该覆盖网络上具有容器的节点。因此,一旦 IP 被分配和发现,所有的通信都只发生在具有相关容器的节点之间。如果您创建一个网络,然后在工作人员上列出网络,这在 swarm 模式下很容易看到,它不会存在。一旦该网络上的容器被调度,该网络就会出现。从 docker 来看,这减少了多主机网络的开销,同时也增加了架构的安全性。结果如下图所示:

raft共识本身只需要leader选举。一旦一个节点被选为领导者并且有足够多的节点保持共识,只有一个节点正在写入 KV 存储并维护当前状态。其他人都是追随者。这部动画比我以往任何时候都更好地描述了它。
最后,您无需设置外部 KV 存储即可在 swarm 模式服务之外使用覆盖网络。您可以实现集群模式,使用该选项配置覆盖网络--attachable
,并在该网络上运行集群模式之外的容器,就像使用外部 KV 存储一样。过去我曾将其用作过渡状态,以使容器进入 swarm 模式,其中一些使用 docker-compose 运行,而另一些已部署为 swarm 堆栈。