k8s 无头服务

k8s无头服务

无头服务是什么

无头服务根据我自己的理解来说,我们访问一个服务正常是访问的4层代理service或者7层代理ingress。而无头服务就是跳过这个4层或者7层代理,直接与pod的真实Ip进行访问。正常我们通过nslookup解析到service的ip,而无头服务,通过解析后得到的是后端pod的ip地址

可以使用 Headless Service与其他服务发现机制进行接口,而不必与 Kubernetes 的实现捆绑在一起。
对 Headless Service并不会分配 Cluster IP,kube-proxy 不会处理它们, 而且平台也不会为它们进行负载均衡和路由。 DNS 如何实现自动配置,依赖于 Service 是否定义了选择算符。

获取k8s集群中的dns服务地址

kubectl get svc -n kube-system

image

获取一个应用的headless服务
image

获取服务对应的pod
image

通过nslookup 域名 dns服务器命令解析headless服务对应的ip地址
我们可以看到headless服务其实解析成pod的地址,而如果把域名精确到pod,例如
nacos-0.nacos-hs.nacos.svc.cluster.localya 则可以解析为172.168.217.115
image

普通服务只能解析为服务的地址
image

为什么会有无头服务,用途是什么

Kubernetes (K8s) 中的“无头服务”(Headless Services)是一种特殊类型的服务对象,它不分配一个集群 IP 地址。在 Kubernetes 中,服务(Services)通常用于定义一组 Pod 的逻辑集合,并为这些 Pod 提供网络标识。常规服务会自动获得一个虚拟 IP 地址,使得其他服务可以通过这个稳定的 IP 和端口来访问这组 Pod。

然而,有时候我们并不需要这样的抽象层,而是希望直接通过 Pod 的 IP 地址来访问它们。这时候就可以使用无头服务。以下是无头服务的一些主要用途:

直接 Pod 访问:
当你需要直接通过 Pod 的 IP 或 DNS 名称来访问 Pod 时,可以使用无头服务。
这对于需要知道后端确切 IP 地址的应用程序非常有用,例如某些数据库复制配置。
避免服务发现:
如果你的应用程序不需要或不支持服务发现机制,无头服务可以绕过这一层,直接提供 Pod 的信息。
多播/广播通信:
在一些特定场景下,比如分布式系统中的选举过程或心跳检测等,可能需要直接与所有 Pod 进行通信。无头服务可以通过特殊的 DNS 记录(如 A/AAAA 记录)来实现这一点。
状态fulSet场景:
当你使用 StatefulSet 控制器管理一组有状态的应用程序时,通常会配合使用无头服务,因为每个 Pod 都有一个唯一的、稳定的 DNS 名称,这样更容易进行数据持久化和管理。
特定于应用的需求:
有些应用可能依赖于特定的网络拓扑或配置,例如基于 IP 的负载均衡策略。
创建无头服务时,可以在 Service 的 YAML 文件中设置 clusterIP 字段为 "None"。此外,还可以结合使用 Headless Services 和常规 Service 来满足不同层次的需求。例如,在 StatefulSet 中,你可以有一个无头服务来暴露 Pod 的 IP 地址,并且还有一个常规服务来提供一个统一的入口点。

posted @ 2022-09-21 14:28  liwenchao1995  阅读(986)  评论(0编辑  收藏  举报