为什么 Docker 覆盖网络需要共识?
Why do Docker overlay networks require consensus?
刚刚阅读了 Docker 覆盖网络,非常酷的东西。我似乎无法找到一件事的答案。
根据文档:
- 如果您安装并使用 Docker Swarm,您会自动在 manager/worker 主机上获得覆盖网络,无需再进行任何配置; 但是...
- 如果您只是想要跨多个主机的(非 Swarm)覆盖网络,则需要使用外部 "KV Store"(共识服务器)配置该网络,例如 Consul 或 ZooKeeper
我想知道这是为什么。显然,覆盖网络需要同行之间达成共识,但我不确定为什么 "peers" 甚至是谁。
我只是猜测,对于 Swarm,有一些 internal/under-the-hood 共识服务器 运行 开箱即用。
Swarm 模式使用 Raft 作为管理器与内置 KV 存储的共识。在 swarm 模式之前,覆盖网络可以与第三方 KV 存储一起使用。覆盖网络本身不需要共识,它只依赖于 KV 存储所说的任何内容,而不管其他节点甚至它自己的本地状态(我很难找到这一点)。那里的 KV 存储通常设置为 HA 共识。
KV 存储跟踪每个主机 (IPAM) 上 运行ning 容器的 IP 分配。这允许 docker 只分配给定地址一次,并且当您连接到另一台主机上的容器 运行ning 时,知道它需要与哪个 docker 主机通信。这需要在任何 docker 主机的外部,并且最好在 HA 配置中(如群模式的共识),这样即使某些 docker 节点关闭,它也可以继续工作。
docker 节点之间的覆盖网络仅涉及在该覆盖网络上具有容器的节点。因此,一旦 IP 被分配和发现,所有通信仅发生在具有相关容器的节点之间。如果您创建一个网络然后在工作人员上列出网络,这在 swarm 模式下很容易看到,它不会在那里。一旦该网络上的容器被调度,该网络就会出现。从 docker 开始,这减少了多主机网络的开销,同时也增加了架构的安全性。结果如下图所示:
raft 共识本身只需要领导选举。一旦一个节点被选为领导者并且有足够的节点保持共识,只有一个节点正在写入 KV 存储并维护当前状态。其他人都是追随者。 This animation describes it better than I ever could.
最后,您无需设置外部 KV 存储即可在群模式服务之外使用覆盖网络。您可以实现 swarm 模式,使用 --attachable
选项配置覆盖网络,并在该网络上的 swarm 模式之外配置 运行 容器,就像使用外部 KV 存储一样。我过去用它作为过渡状态让容器进入集群模式,其中一些是 运行 docker-compose 和其他已部署为集群堆栈。
刚刚阅读了 Docker 覆盖网络,非常酷的东西。我似乎无法找到一件事的答案。
根据文档:
- 如果您安装并使用 Docker Swarm,您会自动在 manager/worker 主机上获得覆盖网络,无需再进行任何配置; 但是...
- 如果您只是想要跨多个主机的(非 Swarm)覆盖网络,则需要使用外部 "KV Store"(共识服务器)配置该网络,例如 Consul 或 ZooKeeper
我想知道这是为什么。显然,覆盖网络需要同行之间达成共识,但我不确定为什么 "peers" 甚至是谁。
我只是猜测,对于 Swarm,有一些 internal/under-the-hood 共识服务器 运行 开箱即用。
Swarm 模式使用 Raft 作为管理器与内置 KV 存储的共识。在 swarm 模式之前,覆盖网络可以与第三方 KV 存储一起使用。覆盖网络本身不需要共识,它只依赖于 KV 存储所说的任何内容,而不管其他节点甚至它自己的本地状态(我很难找到这一点)。那里的 KV 存储通常设置为 HA 共识。
KV 存储跟踪每个主机 (IPAM) 上 运行ning 容器的 IP 分配。这允许 docker 只分配给定地址一次,并且当您连接到另一台主机上的容器 运行ning 时,知道它需要与哪个 docker 主机通信。这需要在任何 docker 主机的外部,并且最好在 HA 配置中(如群模式的共识),这样即使某些 docker 节点关闭,它也可以继续工作。
docker 节点之间的覆盖网络仅涉及在该覆盖网络上具有容器的节点。因此,一旦 IP 被分配和发现,所有通信仅发生在具有相关容器的节点之间。如果您创建一个网络然后在工作人员上列出网络,这在 swarm 模式下很容易看到,它不会在那里。一旦该网络上的容器被调度,该网络就会出现。从 docker 开始,这减少了多主机网络的开销,同时也增加了架构的安全性。结果如下图所示:
raft 共识本身只需要领导选举。一旦一个节点被选为领导者并且有足够的节点保持共识,只有一个节点正在写入 KV 存储并维护当前状态。其他人都是追随者。 This animation describes it better than I ever could.
最后,您无需设置外部 KV 存储即可在群模式服务之外使用覆盖网络。您可以实现 swarm 模式,使用 --attachable
选项配置覆盖网络,并在该网络上的 swarm 模式之外配置 运行 容器,就像使用外部 KV 存储一样。我过去用它作为过渡状态让容器进入集群模式,其中一些是 运行 docker-compose 和其他已部署为集群堆栈。