如何 select Kubernetes 中服务的特定 pod

How to select a specific pod for a service in Kubernetes

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

每个副本都需要与所有其他副本通信。另外,还有一个包含所有pods的服务,让这个应用永久可用。

所以我有:

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 个副本的部署,其中每个副本都有一个唯一的通用标签(例如副本 ID,如 1/3、2/3 等等)。

在服务中,我可以使用 selector 来获取此标签,该标签即使在更新后也会存在。

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

但我不知道如何 select 基于运行所在的主机标签的 pod。

不能使用主机名,因为主机名会在不同的环境中发生变化。

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

您可以将 NodeIP:NodePort 映射到 PodIP:PodPort。您的 pod 在某个节点 (Instance/VM) 上是 运行。

  1. 为您的节点分配标签,

    http://kubernetes.io/docs/user-guide/node-selection/

  2. 为你的 pod 写一个服务,例如

service.yaml:

apiVersion: v1
kind: Service
metadata:
  name: mysql-service
  labels:
    label: mysql-service
spec:
  type: NodePort
  ports:
  - port: 3306 #Port on which your service is running
    nodePort: 32001 # Node port on which you can access it statically
    targetPort: 3306
    protocol: TCP
    name: http

  selector:
    name: mysql-selector   #bind pod here
  1. 将节点选择器(在规范字段中)添加到您的 deployment.yaml

deployment.yaml:

spec:
  nodeSelector:
    nodename: mysqlnode #labelkey=labelname assigned in first step

有了这个,您将能够使用 Nodeip:Nodeport 访问您的 pod 服务。如果我用

标记节点 10.11.20.177

nodename=mysqlnode

我会在节点选择器中添加,

nodeSelector:
  nodename : mysqlnode 

我在服务 nodePort 中指定,所以现在我可以访问 pod 服务(在容器中是 运行)

10.11.20.177:32001

但是这个节点应该在同一个网络中,这样它才能访问 pod。对于外部访问,请使用防火墙配置使 32001 可公开访问。它永远是静态的。 Label 将处理您的动态 pod ips。

您正在寻找的功能称为 StatefulSets, which just launched to beta with Kubernetes 1.5(请注意,它以前在 alpha 版中以不同的名称 PetSets 提供)。

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

文档有更多详细信息: