运行 所有 Docker Swarm 节点作为管理者的优缺点?

Pros and Cons of running all Docker Swarm nodes as Managers?

我正在考虑构建一个 Docker Swarm 集群。为了使事情既简单又相对容错,我考虑简单地 运行 3 个节点作为管理器。

不使用任何专用工作节点时有哪些权衡取舍?有什么我应该注意但可能不太明显的吗?

我发现这个 Github issue 提出了类似的问题,但答案对我来说有点模棱两可。它提到性能可能更差。它还提到达成共识需要更长的时间。实际上,什么功能会变慢? "take longer to reach consensus" 究竟有什么影响?

TL;DR Swarm 中作为工人的所有管理者的优缺点:

优点:

  • Prod-quality 只有 3 或 5 个服务器的 HA
  • design/management
  • 的简单
  • 默认情况下仍然安全(机密在磁盘上加密,双向 TLS 身份验证和控制平面上的网络加密)
  • 任何节点都可以管理 Swarm

缺点:

  • 需要更严格的资源管理以防止管理器饥饿
  • 较低的安全状态,secrets/keys 存储在应用程序服务器上
  • 受感染的节点意味着整个 Swarm 很容易被感染
  • 服务器数量限制为奇数,通常为 3 或 5

您问题的完整答案

What are the trade-offs when not using any dedicated worker nodes? Is there anything I should be aware of that might not be obvious?

使用 worker-only 节点没有硬性要求。如果你部署的解决方案你知道你需要什么资源,并且 services/tasks 的数量通常是相同的,那么只要你考虑过,让一个只有三个管理器来完成所有工作的 Swarm 就没有错这三个受影响的地区:

  1. 安全。在一个完美的世界中,您的管理器将无法通过互联网访问,并且只能在后端子网上,仅执行管理器工作。管理员拥有 Swarm 的所有权限,持有所有加密的秘密,存储加密的 Raft 日志,并且(默认情况下)将加密密钥存储在磁盘上。工作人员只存储他们需要的秘密,(并且只在内存中)并且无权在 Swarm 中做任何工作,除了领导者告诉他们要做的事情。如果一个工作人员受到损害,你不一定 "lost the Swarm"。这种权力分离并不是硬性要求,许多环境都接受了这种风险,只是将管理者作为主要服务器,向 public 发布服务。这只是 security/complexity 与成本的问题。
  2. 节点数。冗余的最少管理器数量是 3,而 3 或 5 是我大多数时候推荐的。更多的经理不等于更多的能力,因为任何时候只有一个经理是领导者,并且是唯一一个做经理工作的人。领导者的资源能力决定了它可以同时做多少工作。如果你的经理也在做应用程序工作,并且你需要更多的资源容量然后 3 个节点可以处理,那么我建议第 4 个节点和更高的节点只是工作人员。
  3. Performance/scale。理想情况下,你的经理拥有他们需要的所有资源来快速做事,比如领导人选举、任务调度、运行 和对健康检查做出反应等。他们的资源利用率会随着总节点数、总服务数、以及他们必须执行的新工作的速度(service/network 创建、任务更改、节点更改、健康检查等)。如果你有少量的服务器和少量的 services/replicas,那么只要你小心(对服务使用资源限制)以防止你的应用程序(尤其是数据库),你可能会让管理人员也成为工作人员使 docker 守护程序资源匮乏,Swarm 无法完成其工作。当您开始随机更改领导者或 errors/failures 时,您会希望 "check the managers for available resources" 出现在故障排除步骤的简短列表中。

其他问题:

In practice, what functionality would be slower? And what does "take longer to reach consensus" actually affect?

更多的经理 = 经理在领导下台时选举新领导的时间更长。虽然没有领导者,但 Swarm 处于 read-only 状态,无法启动新的副本任务,也不会发生服务更新。任何失败的容器都不会 auto-recover 因为 Swarm 管理器无法工作。您的 运行 应用程序、入口路由网格等仍然有效。管理器健康和领导者选举的很大一部分性能与所有管理器节点之间的网络延迟相关,就像管理器的数量一样。这就是为什么 Docker 通常建议单个 Swarms 管理器都在同一个区域,这样他们就可以在彼此之间进行 low-latency 往返。这里没有硬规则。如果您测试管理器和测试失败之间的 200 毫秒延迟,并且对领导者选举的结果和速度没有问题,那就太好了。

背景资料:

这完全取决于构建集群的目的。出于开发目的,您可以使用工作节点作为管理器。真正关心的是横向扩展,如果你觉得你的微服务基础设施会继续增长,那么考虑分离工作节点和管理节点以便于横向扩展。

您设置的优点是:

  • 易于管理

  • 设置高度可用 - 3 个节点意味着 1 的容错能力

缺点是:

  • 不利于横向扩展,容器计算需求意味着添加更多工作节点。

  • 额外的管理器节点会降低写入性能,因为更多节点必须确认更新群状态的提议。这意味着更多的网络 round-trip 流量会导致您的服务出现性能问题 如果您的 dockerized 应用程序与主机系统混淆,这将影响管理器服务。 Swarm 任务将继续 运行,但无法添加、更新或删除 swarm 节点,并且无法启动、停止、移动或更新新任务或现有任务。 manager和worker服务隔离更安全