Kubernetes中Pod之间的通信,使用Service对象还是集群网络?

8
我是Kubernetes的新手,遇到了以下情况:我有两个不同的Pods:PodAPodB。首先,我想将PodA暴露给外部世界,因此我为PodA创建了一个Service(类型为NodePort或LoadBalancer),这对我来说并不难理解。
然后我希望 PodAPodB 之间进行通信,经过几个小时的搜索,我发现答案是我还需要为 PodB 创建一个 Service(如果我想让 PodB 仅在集群内可见,则为 ClusterIP 类型),如果这样做,我可以让 PodAPodB 相互通信。但问题是我也发现了 this article。根据这个网页,他们说 同一节点上的 Pod 之间的通信 可以通过 cbr0、一个 网络桥接器 或者 不同节点上的 Pod 之间的通信 可以通过集群的 路由表 进行,而他们没有提到 Service 对象(这意味着我们不需要 Service 对象吗?) 。
事实上,我也阅读了K8s的文档,并在集群网络中发现:

集群网络
...
2. Pod对Pod通信:这是本文档的重点。
...

他们也专注于Pod对Pod通信,但没有与Service对象相关的内容。
所以,我现在非常困惑,我的问题是:您能否向我解释文章中这些东西与Service对象之间的联系? Service对象是cbr0route table的高级抽象吗?最终,Pods如何相互通信?
如果我有什么误解,请指出来,我非常感激。
谢谢!

如果您的 podA 需要通过 ClusterIP 连接到 podB,则应用程序无需了解集群使用的 CNI。 - c4f4t0r
4个回答

3
在Kubernetes集群中使用服务的动机。
Kubernetes Pod是临时的。它们一出生,就会死亡,并且不会复活。如果您使用Deployment运行应用程序,则可以动态创建和销毁Pod。
每个Pod都有自己的IP地址,但在一个Deployment中,某一时刻运行的Pod集合可能与稍后运行该应用程序的Pod集合不同。
这导致了一个问题:如果某些Pod集合(称为“后端”)为群集中的其他Pod集合(称为“前端”)提供功能,则前端如何找到并跟踪要连接到哪个IP地址,以便前端可以使用工作负载的后端部分?
因此,在动态管理部署(podA和podB)时,服务非常方便。

2

如果您的PodA知道PodB的地址或DNS名称,则始终可以与PodB通信。在集群环境中,可能会存在多个PodB的副本,或者PodB的实例可能会死亡并被具有不同地址和不同名称的另一个实例替换。 Service是处理这种情况的抽象概念。如果您使用Service来公开PodB,则集群中的所有Pod都可以使用该服务与PodB的实例进行通信,该服务具有固定的名称和固定的地址,无论PodB有多少个实例以及它们的地址是什么。


谢谢您的回答,所以我的理解是我在问题中提到的 cbr0路由表 是 K8s 中的低级别,而 Service 是我们作为程序员可以用来处理问题的高级别。我是对的,对吗?如果我说了一些愚蠢的话,请原谅,但我只是想知道这些东西之间是否有关联。 - nxh6991
没错。k8s管理节点上的路由表,以实现您应该使用的高级网络。桥接、路由表等是底层网络的组成部分。K8s使用这些基元实现了软件定义网络。正如我所说,您可以直接访问Pod而无需服务,因为网络已配置为支持此操作,但服务会为您提供一个固定的名称和地址,无论目标Pod的位置和名称如何。 - Burak Serdar

0

首先,我理解你正在处理两个应用程序,例如ApplicationAApplicationB。在考虑架构时不要使用Pod抽象。在Kubernetes上,您正在处理分布式系统,并且它被设计为您应该拥有多个应用实例,例如用于高可用性。每个应用程序实例都是一个Pod

将您的应用程序ApplicationAApplicationB部署为 Deployment资源。然后很容易进行滚动升级而不会有停机时间,并且Kubernetes将重新启动任何实例如果它崩溃。

对于每个部署或您的应用程序,请创建一个服务资源(例如ServiceA和ServiceB)。当您从ApplicationA通信到另一个应用程序时,请使用服务,例如ServiceB。该服务将平衡负载您的请求到其他应用程序实例,并且您可以升级您的部署而无需停机。

0

1. 集群网络:顾名思义,所有部署在集群中的 Pod 将会通过实现任何 Kubernetes 网络模型(如 DANM、flannel)相互连接。 请查看此链接以了解如何创建集群网络。 创建集群网络

安装 CNI(通过实现集群网络)后,每个 Pod 都将获得一个 IP 地址。

2. 使用 ClusterIP 类型创建的 Service 对象,会指向内部创建的这些 IP 地址(通过端点)以进行通信。

回答你的问题,是的,Service 对象是 cbr0 和路由表的高级抽象。

你可以使用 Service 对象在 Pod 之间进行通信。 如果网络比较复杂,还可以实现像 envoy/Istio 这样的服务网格。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接