1

我想知道是否有办法为特定节点上的 pod 创建服务。例如:

假设我有一个包含 4 个工作节点 [compute-0 ... compute-3] 的集群。

节点“compute-0”和“compute-1”有一个标签“app=firstApplication”

节点“compute-2”和“compute-3”具有不同的标签“app=secondApplication”

我有一个在所有 4 个节点上运行的守护程序集。

我想创建 2 个服务,每个节点一个。这有可能吗?

谢谢!

编辑

我们尝试这样做的原因是我们有一个 Openshift4.6 集群,出于安全原因,我们在 2 组节点之间封锁了 VXLAN 端口。当 pod 尝试使用默认 dns 服务 (172.30.0.10) 解析 DNS 查询时,有时它们会访问被屏蔽节点上的 dns pod。

4

2 回答 2

1

不——这是不可能的!由于服务通过标签引用它们的 Pod,并且 DaemonSet 中的所有 Pod 都标记为相同,因此您不能这样做。当然,您可以在创建 Pod 后标记您的 Pod,但由于在重新创建 DaemonSet 后它会丢失,所以我不会走那条路。

您可以将 DaemonSet 拆分为多个部分,并使用Node Selectors 或 Affinity来控制 Pod 在 Node 上的分布。

如果您指定 .spec.template.spec.nodeSelector,则 DaemonSet 控制器将在与该节点选择器匹配的节点上创建 Pod。同样,如果您指定 .spec.template.spec.affinity,则 DaemonSet 控制器将在与该节点关联性匹配的节点上创建 Pod。

这样,每个 DaemonSet 都可以拥有自己的 Service。

于 2021-01-19T08:47:37.657 回答
0

您只需要修补现有的 pod。在您的 pod 中添加这些标签。可能是您需要处理另一个操作员。操作员的工作是首先获取吊舱。然后检查欲望标签是否存在。如果不存在,则修补 pod 的标签。这就像kubectl补丁。kubeclient如果标签不存在于 pod 中,则只需更新标签即可。做一些关于kubeclient的研究。Kubernetes 中还有一个示例样本控制器。链接在这里 :

参考

如果 pod 中有一些额外的标签,只需将它们添加到选择器中。

---
kind: Service
apiVersion: v1
metadata:
  name: first-svc
  labels:
    app: firstApplication
spec:
  selector:
    app: firstApplication
  ports:
    - name: http 
      port: 8080
      targetPort: 8080

---
kind: Service
apiVersion: v1
metadata:
  name: second-svc
  labels:
    app: secondApplication
spec:
  selector:
    app: secondApplication
  ports:
    - name: http 
      port: 8080
      targetPort: 8080
---
于 2021-01-19T09:31:21.103 回答