【问题标题】:How to prevent data inconsistency when one node lose network connectivity in kuberneteskubernetes中一个节点断网时如何防止数据不一致
【发布时间】:2022-01-05 11:06:49
【问题描述】:

我有一个集群,其中包含一个服务(我们将其命名为 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 在要将其旧状态数据保存在磁盘上时失败)

【问题讨论】:

    标签: kubernetes docker-swarm high-availability ceph remotestorage


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 好的。我测试你说的,但有问题。当工作节点失去与主节点的连接时,它不会关闭正在运行的任务,当连接得到修复时,swarm master 终止了工作节点上的旧任务。我可以制作视频给你看测试。
    猜你喜欢
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    • 1970-01-01
    • 1970-01-01
    • 2016-04-03
    相关资源
    最近更新 更多