【问题标题】:Internal and external cluster communication in Kubernetes clusterKubernetes集群内外部集群通信
【发布时间】:2017-12-23 20:33:54
【问题描述】:

我在 Google Kubernetes Engine (GKE) 上构建了一个 Kubernetes 集群。它基本上是一个 Service 和一个关联的 ReplicaSet 和一些 pod。

这些 pod 需要相互交谈以保持共识。为此,ClusterIP 似乎很合适,允许 pod 的集群内通信。

但是,现在我想向全世界公开这个服务。我的想法是从ClusterIP 切换到NodePort 并将其与Ingress 结合起来,这似乎是best practice

我的问题是,当我将 Service 切换到 NodePort 时,我失去了集群的内部通信,即 pod 无法相互通信。据我了解,NodePortis a superset of ClusterIP,所以应该保持内部沟通。

我做错了什么?


使用额外信息进行编辑:

我指的是this example,一个 Neo4j 图数据库的例子。

该示例部署了一个 StatefulSet,其中 pod 需要进行通信,以保持集群之间的共识。

使用提供的设置,Pod 可以相互通信。如果我将Service 更改为NodePort,并修复使用的nodePorts(而不是像往常那样随机选择它们),Pod 将无法再进行通信。

这是预期的行为,还是我遗漏了什么?

【问题讨论】:

  • 这一定是 GKE 特有的错误,因为我 100% 肯定 NodePort 和 ClusterIP 共存,因为我们集群中 80% 的 Pod 很容易使用 ClusterIP 与其他服务通信(而且一个很棒的正是出于您提到的 Ingress 原因,我们的服务都是 NodePort)。现在我不能百分百肯定地说他们是否可以用那种方式彼此交谈。
  • 您能否详细介绍一下“失去内部沟通”在实践中的样子? DNS 失败、TCP 拒绝、TCP 超时、Y 中的 X 连接失败……诸如此类
  • 我在问题中添加了示例。失去内部通信意味着 Pod 将永远处于以下状态:2017-09-13 09:39:59.977+0000 INFO Attempting to connect to the other cluster members before continuing...

标签: neo4j kubernetes google-kubernetes-engine


【解决方案1】:

确实NodePortClusterIP 的超集,但需要明确的是,您不需要服务为NodePort 类型就可以被IngressController 公开。 IC 可以直接访问端点(pod),所以除了ClusterIP 之外不需要使用任何东西。

另一件事是 ClusterIP 服务对 pod 到 pod 的连接没有影响,而且你会使用服务来允许共识聊天似乎有点奇怪(除非你每个 pod 都有一个 svc)。对于此类操作,您可能需要仔细查看 StatefulSet 概念

【讨论】:

  • 据我所知,在 GKE 中,您 can't 公开了带有 Ingress 的 ClusterIP,但我不是 100% 确定。
猜你喜欢
  • 2018-08-14
  • 1970-01-01
  • 2020-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-07
相关资源
最近更新 更多