如何在Kubernetes中为服务选择特定的pod

Hot*_*r13 4 kubernetes kubernetes-deployment

我有一个由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)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

另一种解决方案可能是选择pod/deployment,具体取决于运行它的主机.我可以使用DaemonSet或只是一个具有亲缘关系的pod /部署来确保每个主机都具有我部署的完全一个副本.

但我不知道如何根据运行它的主机标签选择一个pod.

使用主机名不是一个选项,因为主机名将在不同的环境中更改.

我已经搜索了文档,但对这个用例没什么好处的.希望这里有人知道如何解决这个问题.

Tim*_*air 8

您正在寻找的功能称为StatefulSets,它刚刚推出Kubernetes 1.5测试版(注意它以前以alpha的形式提供,名称不同,PetSets).

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

文档有更多细节:

  • 好的,发现了这个问题.服务必须是无头的.然后可以使用<petname>.<service>.<namespace> .svc.<cluster_domain>来解析pody. (3认同)