我对k8s中无头服务的理解以及两个需要验证的问题

use*_*225 1 kubernetes kubernetes-pod kubernetes-service

我正在学习kubernetes的无头服务。

我毫无疑问地理解以下内容(如果我错了,请纠正我):

  • 无头服务没有集群 IP,
  • 它用于与有状态应用程序通信
  • 当客户端应用程序容器/pod 通过无头服务与数据库 pod 通信时,将返回 pod IP 地址而不是服务的 IP 地址。

我不太确定的是:

  • 在我看来,互联网上许多解释无头服务的文章都很模糊。因为我发现的所有内容都只是直接陈述如下:

如果你不需要负载均衡,但想直接连接到pod(例如数据库),你可以使用headless服务

但这到底是什么意思呢?

因此,以下是我对 k8s 中无头服务的想法以及两个带有示例的问题

假设我在一个服务后面有 3 个 PostgreSQL 数据库实例的副本,如果它是一个常规服务,我知道默认情况下对数据库的请求将以循环方式路由到三个数据库 Pod 之一。这确实是一个负载平衡。

问题一:

如果使用无头服务,上面引用的语句是否意味着无头服务将坚持使用三个数据库 pod 之一,并且永远不会更改,直到 pod 死亡?我问这个问题是因为否则如果不坚持使用三个 Pod 之一,它仍然会进行负载平衡。有人可以澄清一下吗?

问题2:

我觉得无论是常规服务还是无头服务,客户端应用程序只需要知道服务的 DNS 名称即可与 k8s 集群中的数据库进行通信。不是这样吗?我的意思是,那么使用无头服务有什么意义呢?对我来说,只有当客户端应用程序代码确实需要知道它所连接的 Pod 的 IP 地址时,无头服务才有意义。因此,只要客户端应用程序不需要知道 IP 地址,它始终可以通过集群中的服务 DNS 名称通过常规服务或无头服务与数据库进行通信,我在吗?

Dav*_*aze 5

普通的服务带有负载均衡器(即使它是 ClusterIP 类型的服务)。该负载均衡器有一个 IP 地址。服务的集群内 DNS 名称解析为负载均衡器的 IP 地址,然后转发到选定的 Pod。

无头服务没有负载均衡器。服务的 DNS 名称解析为 Pod 本身的 IP 地址。

这意味着,对于无头服务,基本上一切都取决于调用者。如果调用者进行 DNS 查找,选择给定的第一个地址,并在进程的生命周期内使用该地址,那么它不会在支持的 Pod 之间循环请求,也不会注意到该 Pod 是否消失。对于普通服务,只要调用者获取服务(集群内部负载均衡器)的 IP 地址,这些问题就会自动处理。

无头服务并不专门与有状态工作负载相关,只是 StatefulSet 需要无头服务作为其配置的一部分。单个 StatefulSet Pod 实际上会被赋予一个连接到该无头 Service 的唯一主机名。不过,您可以让普通服务和无头服务都指向同一个 Pod,并且在您不关心(最初)联系哪个副本的情况下,使用普通服务可能是有意义的。