11

我有一个由 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。

使用主机名不是一个选项,因为主机名会在不同的环境中改变。

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

4

2 回答 2

12

您正在寻找的功能称为StatefulSets ,它刚刚在Kubernetes 1.5中推出 beta 版(请注意,它以前在 alpha 版中以不同的名称 PetSets 可用)。

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

该文档有更多详细信息:

于 2016-12-15T18:42:10.707 回答
0

您可以将 NodeIP:NodePort 映射到 PodIP:PodPort。您的 pod 正在某个节点(实例/虚拟机)上运行。

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

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

  2. 例如,为您的 pod 编写服务

服务.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

部署.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 ip。

于 2016-12-15T15:16:36.367 回答