如何 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) 上是 运行。
为您的节点分配标签,
为你的 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
- 将节点选择器(在规范字段中)添加到您的 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 在另一个节点上重新创建),您不需要每个实例的服务。
文档有更多详细信息:
我有一个由 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) 上是 运行。
为您的节点分配标签,
为你的 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
- 将节点选择器(在规范字段中)添加到您的 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 在另一个节点上重新创建),您不需要每个实例的服务。
文档有更多详细信息: