0

我有一种情况,我有一个带有服务的集群(我们将其命名为 A1),它的数据在我的例子中位于远程存储(如 cephFS)上。我的服务的副本数为 1。假设我的集群中有 5 个节点,服务 A1 驻留在节点 1 中。节点 1 网络发生了一些事情,它也失去了与 cephFS 集群和我的 Kubernetes 集群的连接(或 docker-一群)。集群将其标记为无法访问并在节点 2 上启动一个新服务(我们将其命名为 A2)以保持副本为 1。例如 15 分钟后,节点 1 网络固定并且节点 1 回到集群并且服务 A1 已经运行(假设它在失去与远程存储的连接时没有崩溃)。

我使用 docker-swarm,最近切换到 Kubernetes。我看到 Kuber 有一个名为 StatefulSet 的功能,但是当我读到它时。它没有回答我的问题。(或者当我读到它时我可能会错过一些东西)

问题A:集群是做什么的。是保持 A2 并关闭 A1 还是让 A1 继续工作并关闭 A2(逻辑上它应该关闭 A1)

问题 B(也是我的主要问题!):假设集群想要关闭这些服务(例如 A1)。此服务在要关闭时会节省一些存储空间。在这种情况下,状态 A1 保存到磁盘,具有较新状态的 A2 在 A1 网络修复之前保存了一些内容。当我们将卷挂载到容器时必须有一些锁,当它附加到一个容器时,其他容器无法写入该容器(当 A1 想要将其旧状态数据保存在磁盘上时失败)

4

1 回答 1

0

它的工作方式 - 使用 docker swarm 术语 -

你有服务。服务是对您要运行的某个图像的描述,有多少副本等等。假设服务指定至少 1 个副本应该运行,它将创建一个任务,该任务将在 swarm 节点上调度容器。因此,该服务与 0 到多个任务相关联,其中每个任务都有 0 - 如果它仍在启动或 1 个容器 - 如果任务正在运行或停止 - 它位于节点上。

因此,当 swarm(orcestrator)检测到一个节点离线时,它主要看到与服务相关的许多任务已经丢失了它们的容器,因此复制(就正在运行的任务而言)对于该服务不再正确,它会创建新任务,这些任务反过来会在可用节点上调度新容器。

在断开连接的节点上,swarm worker 注意到它已经失去了与 swarm 管理器的连接,因此它清理了它持有的所有任务,因为它不再拥有关于它们的当前信息。在清理任务的过程中,相关的容器会停止。

这很好,因为当节点最终重新连接时,没有两个任务正在运行的竞争条件。只有“A2”在运行,“A1”已关闭。如果您遇到节点可能经常失去与管理器的连接的情况,那么这很糟糕,但是无论如何您都需要服务在这些节点上继续运行,因为每次工作人员分离时它们都会关闭。

K8s 上的过程几乎相同,只是更改了术语。

于 2022-01-06T14:12:02.917 回答