我有一个由 3 个主机组成的 kubernetes 集群,其中每个主机都有一个唯一的 ID 标签。
在这个集群上,有一个软件有 3 个实例(副本)。

每个副本都需要与所有其他副本对话。此外,还有一个包含所有 pod 的服务,以便此应用程序永久可用。

所以我有:

Instance1 (with labels run: theTool,instanceid: 1)
Instance2 (with labels run: theTool,instanceid: 2)
Instance3 (with labels run: theTool,instanceid: 3)


Service1 (selecting pods with label instanceid=1)
Service2 (selecting pods with label instanceid=2)
Service3 (selecting pods with label instanceid=3)
Service (selecting pods with label run=theTool)

这种方法有效,但我无法扩展或使用滚动更新功能。

我想定义一个具有 3 个副本的部署,其中每个副本都获得一个唯一的通用标签(例如,像 1/3、2/3 等的副本 ID)。

在服务中,我可以使用选择器来获取即使在更新后也会存在的标签。

另一种解决方案可能是选择 pod/deployment,具体取决于运行它的主机。我可以使用 DaemonSet 或仅使用具有亲和性的 pod/deployment 来确保每个主机都具有我的部署的精确副本。

但我不知道如何根据运行的主机标签来选择 pod。

使用主机名不是一种选择,因为主机名会在不同的环境中发生变化。

我搜索了文档,但没有找到与此用例匹配的任何内容。希望这里有人知道如何解决这个问题。

最佳答案

您正在寻找的功能称为 StatefulSets ,它刚刚与 Kubernetes 1.5 一起发布到测试版(请注意,它以前以不同的名称 PetSets 在 alpha 版中可用)。

在 StatefulSet 中,每个副本都有一个唯一的名称,该名称在重新启动时保持不变。在您的示例中,这些将是 instance-1、instance-2、instance-3。由于实例名称是持久的(即使 pod 在另一个节点上重新创建),您不需要每个实例的服务。

该文档有更多详细信息:

  • Using StatefulSets
  • Scaling a StatefulSet
  • Deleting a StatefulSet
  • Debugging a StatefulSet
  • 关于kubernetes - 如何为 Kubernetes 中的服务选择特定的 pod,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41166622/

    10-16 22:31